|
代碼如下,用 KEIL 仿真時(shí)沒有任何問(wèn)題,但是寫進(jìn)芯片的時(shí)候不知為何 data_len 的值就會(huì)變成 FF(還是其他的值不知道),然后單片機(jī)串口就一直發(fā)送 "Error: Command length too long!\r\nThe maximum allowable length is 10\r\n" ,當(dāng)我將 data_len 的值改成 1 的時(shí)候單片機(jī)一直給上位機(jī)發(fā) "Y",我初步懷疑是程序開始的時(shí)候不知道在哪個(gè)地方觸發(fā)了一次中斷,試了一晚上都試不出來(lái)結(jié)果,不得已才求助論壇。希望能解決這個(gè)問(wèn)題。
- /*
- 功能:帶協(xié)議的 51 串口通信
- 協(xié)議格式:數(shù)據(jù)長(zhǎng)度 + 數(shù)據(jù)
- 數(shù)據(jù)類型:字符型(不適用于 hex 數(shù)據(jù))
- 注意:一次接收的數(shù)據(jù)長(zhǎng)度不能大于 10
- */
- #include <reg52.h>
- #include <string.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar clock[4]={11,23,34,51};
- char recv[11]; // 接收數(shù)據(jù)緩沖區(qū), char 類型用于比較字符串, 長(zhǎng)度加 1 是為了加 \0
- uchar data_len=0; // 指令長(zhǎng)度標(biāo)志位
- uchar data_len_bak=0;
- bit receive_complete=0; // 數(shù)據(jù)接收完成標(biāo)志位
- void delay(uint i) // 1ms 延時(shí)
- {
- uint j;
- while(i--)
- for(j=0;j<192;j++);
- }
- void init(void)
- {
- TMOD=0x20; // 設(shè)置定時(shí)器1為工作方式2(8位自動(dòng)重載),高八位為重載常數(shù),溢出時(shí)低八位自動(dòng)從高八位取初值
- TH1=0xfd; // 9600 波特率
- TL1=0xfd;
- TR1=1;
- EA=1;
- ES=1; // 串口中斷允許
- REN=1;
- SM0=0;
- SM1=1;
- }
- void send(uchar d)
- {
- SBUF=d;
- while(!TI);
- TI=0;
- }
- void sendarr(uchar *pd, uchar len)
- {
- // 發(fā)送一個(gè)數(shù)組
- while(len--)
- {
- send(*pd);
- pd++;
- }
- }
- void main()
- {
- init();
- while(1)
- {
- if(data_len_bak>10)
- {
- ES=0;
- sendarr("Error: Command length too long!\r\nThe maximum allowable length is 10\r\n", 69);
- delay(500);
- ES=1;
- data_len = 0;
- continue;
- }
- if(receive_complete)
- {
- ES=0;
- //recv[data_len_bak] = '\0'; // 給接收到的數(shù)據(jù)最后加上 \0 用于比較字符串
- //if(strcmp(recv, "clock")==0) sendarr(clock, 4);
- send('Y');
- ES=1;
- }
- }
- }
- void uart(void) interrupt 4 // 串口中斷
- {
- if(RI) // 收到數(shù)據(jù)
- {
- if(data_len==0)
- {
- data_len=SBUF; // 如果 data_len 為0,即沒收到數(shù)據(jù),于是就初始化數(shù)據(jù)長(zhǎng)度
- data_len_bak=data_len;
- }
- else
- {
- recv[data_len_bak - data_len] = SBUF;
- data_len--;
- if(data_len==0) receive_complete=1; // 如果 data_len 減到0,即數(shù)據(jù)已接收完成
- }
- RI=0;
- }
- }
復(fù)制代碼
|
|