|
代碼如下,用 KEIL 仿真時沒有任何問題,但是寫進芯片的時候不知為何 data_len 的值就會變成 FF(還是其他的值不知道),然后單片機串口就一直發送 "Error: Command length too long!\r\nThe maximum allowable length is 10\r\n" ,當我將 data_len 的值改成 1 的時候單片機一直給上位機發 "Y",我初步懷疑是程序開始的時候不知道在哪個地方觸發了一次中斷,試了一晚上都試不出來結果,不得已才求助論壇。希望能解決這個問題。
- /*
- 功能:帶協議的 51 串口通信
- 協議格式:數據長度 + 數據
- 數據類型:字符型(不適用于 hex 數據)
- 注意:一次接收的數據長度不能大于 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]; // 接收數據緩沖區, char 類型用于比較字符串, 長度加 1 是為了加 \0
- uchar data_len=0; // 指令長度標志位
- uchar data_len_bak=0;
- bit receive_complete=0; // 數據接收完成標志位
- void delay(uint i) // 1ms 延時
- {
- uint j;
- while(i--)
- for(j=0;j<192;j++);
- }
- void init(void)
- {
- TMOD=0x20; // 設置定時器1為工作方式2(8位自動重載),高八位為重載常數,溢出時低八位自動從高八位取初值
- 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)
- {
- // 發送一個數組
- 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'; // 給接收到的數據最后加上 \0 用于比較字符串
- //if(strcmp(recv, "clock")==0) sendarr(clock, 4);
- send('Y');
- ES=1;
- }
- }
- }
- void uart(void) interrupt 4 // 串口中斷
- {
- if(RI) // 收到數據
- {
- if(data_len==0)
- {
- data_len=SBUF; // 如果 data_len 為0,即沒收到數據,于是就初始化數據長度
- 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,即數據已接收完成
- }
- RI=0;
- }
- }
復制代碼
|
|