标题:
关于89C52单片机串口通信的一个莫名其妙的BUG
[打印本页]
作者:
DHC_King
时间:
2018-2-15 02:06
标题:
关于89C52单片机串口通信的一个莫名其妙的BUG
代码如下,用 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;
}
}
复制代码
作者:
DHC_King
时间:
2018-2-15 17:01
我已经解决了,是串口助手软件的问题,我自己重新写了个串口助手的工具调试了下是没有问题的,主要是用其他的串口助手软件不能方便地按照协议格式来发送数据,我自己写的串口助手程序可以根据自己的需要更改一些功能。
作者:
DHC_King
时间:
2018-2-16 14:44
现在还有一个问题想求助一下广大的朋友,这个程序在复位之后会发送一次 “Error: Command length too long!\r\nThe maximum allowable length is 10\r\n” ,实在想不出原因,各位帮忙看下哪里的错误,谢谢。
新年快乐!
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1