上下位机串口通信遭遇的问题

2019-03-23 18:47发布

labview上位机向单片机发送一组字符串:单字符0、单字符1、单字符2、单字符3、单字符4;其中单字符0固定为a;
      单字符1在上位机中可通过下拉列表控件编辑5个选项:a b c d e
      单字符2在上位机中可通过下拉列表控件编辑5个选项:a b c d e
      单字节3固定为回车符
      单字节4固定为换行符。
比如单字符1选择为a,单字符2选择为e,则此时,上位机向单片机发送的字符串为:
aae回车符换行符,该组字符对应的十六进制分别为:0x61 0x61 0x65 0x0D 0x0A。


上位机向单片机发送字符串时,产生串口中断,单片机开始接收数据:0x61,0x61,0x65,
并在遇到0x0D时不再接收数据,且在遇到0x0A时关闭串口中断。
即单片机只接收了前三个字符:a a e,并保存在unsigned char USART_RX_BUF[3]中。
即USART_RX_BUF[0]=0x61,USART_RX_BUF[1]=0x61,USART_RX_BUF[2]=0x65;
在单片机程序中有如下选择语句:
switch(USART_RX_BUF[1])
{
        case 'a':Start_Frequency=25;break;
        case 'b':Start_Frequency=26;break;
        case 'c':Start_Frequency=27;break;
        case 'd':Start_Frequency=28;break;
        case 'e':Start_Frequency=29;break;
        default:break;
}
switch(USART_RX_BUF[2])
{
    case 'a':End_Frequency=29;break;
        case 'b':End_Frequency=30;break;
        case 'c':End_Frequency=31;break;
        case 'd':End_Frequency=32;break;
        case 'e':End_Frequency=33;break;
        default:break;
}

上文有提到,单字符1和单字符2可通过上位机的下拉列表输入控件实现多种选择,最终
是为了实现Start_Frequency和End_Frequency的多个选择。
单片机程序main.c中主要的功能是测量温度和幅度,然后将温度和幅度数据上传给上位机。

在调试过程中,让我疑惑不解的是:比如
(1)通过上位机向单片机发送字符串:aae回车符换行符,单片机接收前3个字符,所以有
     USART_RX_BUF[0]=0x61,USART_RX_BUF[1]=0x61,USART_RX_BUF[2]=0x65;
     此时的Start_Frequency=25,End_Frequency=33;
     但是单片机上传给上位机的数据明显不对;
(2)如果在单片机中直接初始化USART_RX_BUF[3],即
    USART_RX_BUF[0]=0x61,USART_RX_BUF[1]=0x61,USART_RX_BUF[2]=0x65;
    此时的Start_Frequency当然仍是25,End_Frequency也是33;
    这个时候单片机上传给上位机的数据才是正确的。
原因在哪里呢?
我有考虑过上面的switch(USART_RX_BUF[1])和switch(USART_RX_BUF[2]),会不会以为串口
多次收发过程中,会改变第一次收到的UASRT_RX_BUF[1]和USART_RX_BUF[2]的值,从而导致
后面的Start_Frequency和End_Frequency的设置改变。
如果是这样的话,我我应该怎样保存我第一次收到的UASRT_RX_BUF[1]和UASRT_RX_BUF[2],
来保证这两个数据不管串口通信如何进行收发,都不会改变呢?
之所以会有这样的考虑,是因为在多次调试过程中,发现,只要UASRT_RX_BUF[1]和
UASRT_RX_BUF[2]在main函数一开始就直接初始化,而不通过上位机串口通信来设置,
上位机上的数据就总是对的。
一旦通过上位机来控制UASRT_RX_BUF[1]和UASRT_RX_BUF[2],上位机的程序就完全不对。


这就是我目前的困难,坛友们有什么建议吗?求指教!谢谢






此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
qiwan
1楼-- · 2019-03-24 00:49
 精彩回答 2  元偷偷看……
qiwan
2楼-- · 2019-03-24 02:52
也就是说,到底是下位机接收的USART_RX_BUF[1]和USART_RX_BUF[2]有问题?还是上述的两个switch语句有问题?
qiwan
3楼-- · 2019-03-24 06:51
刚刚重新试了一下,发现在串行通信最开始的时候,也就是最开始上位机接收到的数据是正确的,但是很快就不对了。我个人觉得还是USART_RX_BUF[1]和USART_RX_BUF[2]的问题,但具体到底是什么问题,我还不太清楚。最有可能的应该是串口通信过程中数据不断被改变导致USART_RX_BUF[1]、USART_RX_BUF[2]会发生变更。
Study_Stellaris
4楼-- · 2019-03-24 11:13
 精彩回答 2  元偷偷看……
qiwan
5楼-- · 2019-03-24 16:49
如果原因是USART_RX_BUF[1]和USART_RX_BUF[2],那到底是上位机没发送好,还是下位机没接收好?刚刚对上位机的各个阶段的数据进行监控,发现上位机确实发送好了。难道真的是下位机没有接收好?可是,下位机接收的数据不对,不对在哪里?
zhaojun_xf
6楼-- · 2019-03-24 18:09
涉及到与串口通信的项目,必须分为两步完成,一就是单片机与串口调试软件,保证单片机收发都是增强的,因为串口调试软件是一定不会错的;二才是用单片机与自己的上位机软件通过。

一就是说,必须要保证一方决定正确,才好找原因。

一周热门 更多>