超级感谢两位版主的帮忙,一直在纠结上位机和下位机的通信问题,却忘记了得力的串口调试助手。
(1)用串口调试助手向单片机发送字符串:Aae回车符换行符,十六进制显示为:41 61 65 0D 0A
得到的数据是这样的:
串口调试助手第一次发送上述字符串,单片机第一次返回的数据:
41 15 19 4D 00 4E
15 19 4D 00 4E
15 19 4D 00 4E
00 00 00 00 00
19 21 C8 00 00 00 80
串口调试助手第二次发送上述字符串,单片机第二次返回的数据:
41 15 19 4D 00 4E
15 19 4D 00 4E
15 19 4D 00 4E
41 61 65 0D 0A
19 21 C8 00 00 00 80
串口调试助手第三次发送上述字符串,单片机第三次返回的数据:
41 15 19 4D 00 4E
15 19 4D 00 4E
15 19 4D 00 4E
41 61 65 0D 0A
19 21 C8 00 00 00 80
——————————————————————————————
上面标红的数据:串口调试助手给单片机发送数据,单片机一旦接收到
数据,就将接收到的数据保存在字符数组USART_RX_BUF[5]中,并返回给
串口调试助手。
很意外的发现:串口调试助手第一次虽然发送的是:41 61 65 0D 0A
但单片机返回的并不是41 61 65 0D 0A,而是00 00 00 00 00。
而程序接下来执行并返回给助手的数据全部是错误的。
(2)接下来不用串口调试助手发送数据,而是直接在main函数的while(1)的一开始
就字节直接初始化USART_RX_BUF[5]:
while(1)
{
USART_RX_BUF[0]=65; // 0x41
USART_RX_BUF[1]=97; //0x61
USART_RX_BUF[2]=101;//0x65
USART_RX_BUF[3]=13;//0x0D
USART_RX_BUF[4]=10;//0x0A
...
...
...
}
单片机第一次返回的数据为:
41 16 21 19 00 51
15 19 38 00 4F
16 11 D0 00 4C
41 61 65 0D 0A
19 21 C8 00 00 00 80
___________________________________
程序执行下来所有的数据都是我期望的。
***************************************
也就是说,在用串口调试助手时发现,单片机返回我所期望的数据,需要满足:
上位机发送了 41 61 65 0D 0A,第一次返回的也必须是41 61 65 0D 0A.
否则,即使第二次第三次第n次返回的值是41 61 65 0D 0A,
返回的值都是正确的,但第一次返回的值不对,都是徒劳的。
于是,我就在while(1)中加了一个判断语句:
while(1)
{
data[15]=USART_RX_BUF[0];
data[16]=USART_RX_BUF[1];
data[17]=USART_RX_BUF[2];
data[18]=USART_RX_BUF[3];
data[19]=USART_RX_BUF[4];
if((data[15]!=0)&&(data[16]!=0)&&(data[17]!=0)&&(data[18]!=0)&&(data[19]!=0))
{
...
}
...
}
因为第一次返回的数值是00 00 00 00 00,既然不对,那我就放弃不要了,
第二次返回的数值是 41 61 65 0D 0A,那么就从第二次开始,程序接着往下执行。
于是,结果就对了。
下午的调试过程就是这样的。
很感谢两位版主的提醒,谢谢!
至于第一次返回的值为什么是00 00 00 00 00,我觉得可能是单片机还没来得及读
串口调试助手发送来的数据,就直接给助手返回数据了。
|