这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» 8051单片机串口调试求助

共6条 1/1 1 跳转至

8051单片机串口调试求助

工程师
2020-05-24 22:17:31 打赏

大家好 !

我目前在学习串口收发数据,目的是接收命令,根据命令修改数组内的值并发送出去,主要有下面两个疑问:


1、串口调试有没有好的方法可以在线仿真,能够看到变量值的每步变化,我尝试用了proteus仿真,串口调试助手发送数据,程序进不了串口中断;


2、我写了下面一段程序,tmp[]数组接收的是串口调试助手发来的命令ASCII码。红色这句修改数组的值出了问题,接收到的ASCII码0-b转换成16进制的0-11,作为数组的下标赋值给b,接收到的ASCII码1 、2、4、8转换成16进制(tmp[2]-0x30),赋值给数组buzzer_value ''。但是实际每次buzzer_value ''都为0X00;后面发送的b 、(tmp[2]-0x30)的值又是对的,不知道中间有什么问题。我尝试把b改成数字下标或者把tmp[2]-0x30改成具体的十六进制数,结果都是对的。


以下是相关源码:

if((tmp[1]>='0')&&(tmp[1]<='9'))
b=tmp[1]-0X30;
else
b=tmp[1]-0X51;
buzzer_value '[ b ]'=(tmp[2]-0x30);

a=0;
while(a<12)
{
SBUF = buzzer_value[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
a++; // 下一个字符
}
SBUF = b;//SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
SBUF = tmp[2]-0X30;//SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
int_tmp();
b=0;


if((tmp[1]>='0')&&(tmp[1]<='9'))
b=tmp[1]-0X30;
else
b=tmp[1]-0X51;
buzzer_value '[ b ]'=(tmp[2]-0x30);

a=0;
while(a<12)
{
SBUF = buzzer_value[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
a++; // 下一个字符
}
SBUF = b;//SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
SBUF = tmp[2]-0X30;//SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
int_tmp();
b=0;





关键词: 单片机 串口调试 UART

工程师
2020-05-24 22:31:09 打赏
2楼

楼主,你这不是串口通讯问题,是数据解析问题。


工程师
2020-05-24 22:34:34 打赏
3楼

用第三方的串口调试软件查原始数据看看


工程师
2020-05-24 22:40:01 打赏
4楼

建议参考网上的状态机程序,对收到的串口数据进行解析。


工程师
2020-05-24 23:08:41 打赏
5楼

感谢分享


工程师
2020-05-24 23:21:23 打赏
6楼

明白了


共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]