|
代码如下,用 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;
- }
- }
复制代码
|
|