View Single Post
Old 27-05-2014, 01:51 AM   #31
dungsinh
Nhập môn đệ tử
 
Tham gia ngày: Oct 2009
Bài gửi: 1
:
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();
}

}
}

thay đổi nội dung bởi: dungsinh, 27-05-2014 lúc 01:57 AM.
dungsinh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn