[求助] 串口发送数据不正确是怎么回事?

wuaiabab   2011-4-19 14:31 楼主
当只发一个数据时,数据是正确的,但是当用查询的方式,连续发送数据的时候,数据就是错误的,而且当判断是否接收到数据结束码时,用查询方式也不能使数据连续发送,屏蔽此条语句后便可连续发送。用串口调试助手接收数据。是先采集数据,然后再发到串口。
我怀疑能不能是结束码这出现了错误,但是我有不知道是怎么回事。
请高手帮忙啊,弄不出来,很着急!!!!

回复评论 (16)

编程有误,要等前一个数据字节发送结束后才能向串口寄存器压入新的数据。
点赞  2011-4-19 23:21

回复 沙发 chunyang 的帖子

我主程序里用的是while(1)循环查询,每循环一次就采集一次数据,然后发送一次,发送结束后才能进入下一次循环再采集数据,所以不存在前一个字节未发送完就又压入新的数据,
点赞  2011-4-25 08:24
在采集数据的代码里若有判断是否接收到数据采集完成的结束码        if(((TN_Data_Buff[2])&0x00ff) == 0x000d)     //判断是否读到结束标志
这样采集和接收到的数据都是正确的,但是这个程序不能自动执行,连着仿真器却能正确执行并在串口调试助手上看到数据,但是当我把这条语句屏蔽掉,它就能自动执行,并且能连续采集发送数据,但数据是错的。
点赞  2011-4-25 08:33
用仿真器正常而你的系统不正常要考虑二者的差别,这里主要是波特率问题,仿真器的主频和你的系统未必相同,要根据你的系统时钟来设置波特率发生器的参数。
点赞  2011-4-25 12:16

回复 5楼 chunyang 的帖子

我不太明白,能详细的给我说一下我应该怎么修改吗
点赞  2011-4-25 13:59
去看你所用MCU的器件手册,上面有波特率配置算法,我不知道你用的是什么,自然也无法说明,不同MCU配置波特率的方法可不同,你去看手册就该知道了。
点赞  2011-4-25 19:42

回复 7楼 chunyang 的帖子

我用的是凌阳的61板,
*P_UART_BaudScalarHigh = C_UARTBaudRate_9600_H;                // 波特率设为9600
*P_UART_BaudScalarLow = C_UARTBaudRate_9600_L;
波特率设置能有什么错误啊?我的串口调试助手设置的波特率也是9600.
点赞  2011-4-25 20:38

回复 7楼 chunyang 的帖子

是把波特率设置成一致的就可以了吗?
点赞  2011-4-25 20:49
波特率设置参数跟主频是相关的,通常设置方法不应该是8楼那样,具体去看芯片手册。
点赞  2011-4-26 00:01

回复 10楼 chunyang 的帖子

如果不是波特率设置错误,还能有其他可能造成这种状况的原因吗?
点赞  2011-4-27 19:22
你看看晶振的设置是不是正确的
*我的EMAIL:     sunke9@qq.com   *我的博客http://blog.ednchina.com/sunke9/ *我网店:https://sunke9.taobao.com/ 承接:电子、自动控制产品设计开发;单片机、ARM编程。
点赞  2011-4-28 11:32

回复 12楼 SUNKE9 的帖子

晶振是默认的,为24.576MHz。
点赞  2011-4-28 13:52
不是设置错误就是编程错误,不会有其它,但用仿真机时没问题,则可判定是设置错误。
点赞  2011-4-28 14:43
查看下单片机UART的数据手册,看看是怎么一个缓冲,是不是你CPU连续发送过快,导致你的UART无法正常响应,建议这个地方用中断的方式处理,确保每一帧收发完毕
点赞  2011-4-28 16:47
对了,调试有问题的时候尽量降低发送速度和波特率,以及线缆的长度
点赞  2011-4-28 16:48

还请各位大侠帮忙啊!没解决.....

我将代码进行了修改。

代码直接从头执行到尾,由串口调试助手观察采集的数据是错误的,无论是连接仿真器执行还是自主运行都是错误的。

但是,利用仿真器分段执行,过程中进入数据采集的函数,但并不继续在其内部执行,立即跳回主程序,即进入后马上跳出,这样得到的数据就是正确的,不知为什么???

我屏蔽了一些代码,现在的代码功能主要就是采集数据,然后再传送至串口,而且是每采完一次,传送一次,利用while(1)循环查询的方式执行每次采集和传送。

到底是为什么呢???

点赞  2011-5-18 15:52
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复