PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp cổng COM và LPT (http://www.picvietnam.com/forum/forumdisplay.php?f=44)
-   -   Cho hỏi về giao tiếp RS232 của PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=796)

dungsinh 27-05-2014 01:51 AM

Xin hỏi về nhận và xử lý chuỗi trong Pic
 
Xin chào các anh, em đang làm về giao tiếp RS232 từ PC xuống Pic nhưng đang bị vướng mong các anh chỉ giúp. Yêu cầu là truyền một chuỗi lệnh từ PC xuống Pic , Pic sẽ lưu chuỗi này vào mảng st_nhan và xuất chuỗi đã nhận được ra LCD và lên PC để kiểm tra, sau đó nó sẽ so sánh chuỗi nhận được với chuỗi mặc định nếu giống nhau thì sẽ điều khiển đèn B.0 on/off .
Việc nhận và xuất chuỗi ra lcd và lên PC để kiểm tra thì em làm được rồi nhưng khi dùng các lệnh trong thư viện string.h để so sánh mang st_nhan và điều khiển đèn thì không được, không biết còn thiếu cái gì mong các anh chỉ giúp, Em dùng terminal 5.5 để truyền từ PC xuống. Đây là code của em. Rất mong nhận được hồi âm, cảm ơn các anh nhiều.

#include <16f877a.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=8000000)
#use rs232 (baud = 9600,parity = n,xmit=pin_c6,rcv=pin_c7)
#include <LCD.C>
#include <string.h> // thu vien xu ly chuoi
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx
//char st_nhan[]="#123456On1."; // cu phap chuan-1.
//char st_nhan[]="#123456 Off1."; // cu phap chuan-2.
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxx
char st_nhan[32];
char pass[]= "123456" ; //
char mo_tb1[]= "on1" ;
char tat_tb1[]= "off1" ;


char *ptr1;
char *ptr2;
char *p ;

char ss=0x00;
char ss1=0x00;
char ss2=0x00;
char ss3=0x00;
char ss4=0x00;
int8 index,ngat;
int8 i,n,m;

//Ngat UART xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// chuoi ti PC truyen xuong se la : #123456 on1.
#INT_RDA
RDA_isr()
{
ss= getc();

if (ss=='#')
{ ss1=ss; index= 0; st_nhan[index]= ss;}

if(ss=='.')
{ ss2=ss; st_nhan[index]= ss; }

if (ss2=='.'&&ss1=='#') { index= 0; ngat= 1; ss1=0;ss2=0; }

else
st_nhan[index]= ss;
index++;
if(index>=32){index=0;}

}


void xoa_st_nhan()
{
for(m=0;m<=32;++m)
{st_nhan[m]=0;}
}

void main()
{
set_tris_b(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b000);
set_tris_c(0b10000000);

enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

index=0;
ngat=0;
xoa_st_nhan();

output_low(PIN_B0);
output_high(PIN_c0);

LCD_Init();
lcd_gotoxy(0,1);
lcd_putc("Test PC-->Pic");
delay_ms(1);
lcd_gotoxy(0,2);
lcd_putc(" in/out RS232");
delay_ms(1);

while (1)
{
if(ngat==1)
{
output_low(pin_c0);
output_high (pin_c1);

// xuat chuoi nhan duoc len LCD
lcd_send_byte(0,1);
lcd_gotoxy(0,1);
for(i=0;i<=15;i++)
{ lcd_putc(st_nhan[i]);}

lcd_gotoxy(0,2);
for(i=16;i<=31;i++)
{ lcd_putc(st_nhan[i]);}


// xuat chuoi len PC

for(n=0;n<=32;n++)
{
putc( st_nhan[n]);
if(n>=32){putc(13);}
}


// xu ly chuoi bang string.c
ptr1=strstr(st_nhan,pass);
if(strncmp(ptr1,pass,6)==0)
{
ptr2=strstr(st_nhan,mo_tb1);
if(strncmp(ptr2,mo_tb1,3)==0)
{output_high(pin_b0);xoa_st_nhan();}
else
{
ptr1=strstr(st_nhan,tat_tb1);
if(strncmp(ptr1,tat_tb1,4)==0)
{output_low(pin_b0);xoa_st_nhan();}
}
}

delay_ms(3000);
output_low(pin_c1);

ngat=0;
xoa_st_nhan();
}

}
}

ga0rung0 25-03-2016 10:14 PM

mọi người cho hỏi.cái lệnh này trong lập trình pic có tác dụng tn đấy
stream=MYPC trong khai báo
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=MYPC)


Múi giờ GMT. Hiện tại là 03:01 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam