陶新成 发表于 2016-7-11 19:32:48

单片机串口接收频率太高导致串口死机求指点

单片机串口波特率设置在115200,100HZ接收和处理外来数据包然后通过SPI发出,现象是处理一两分钟串口就不再发数了
我想可能是单片机波特率和通信频率过高导致单片机串口工作异常,希望大家给解释一下愿意,提供一些思路

lxa0 发表于 2016-7-11 19:57:34

降低波特率~~~~~~~~~~~~~~缩短2机之间的距离

陶新成 发表于 2016-7-11 20:04:42

lxa0 发表于 2016-7-11 19:57
降低波特率~~~~~~~~~~~~~~缩短2机之间的距离

这个有一定困难,产品是固化的,只能单片机这边想办法了

ilikemcu 发表于 2016-7-11 20:10:16

如果仅仅是来不及处理,那么这种应用出现的问题应该是丢包,而不是死机。
一个串口,不管怎样,硬件设计都已经非常成熟了,而且现在的8位机,即使如STC这样的国产芯片,速度也是非常之快,处理楼主所述的数据应该是不存在多大问题,建议还是从程序框架结构,和逻辑处理上下手,2,3年前我用曾经用STM8L的芯片,ADC以700多KSPS的速率DMA采样,然后每0.5mS的数据累加求平均值以后,从串口发出去,波特率也是115200bps,之所以没有使用STM8L理论极限1MSPS的ADC采样,就是因为MCU实在来不及处理0.5mS里出来的500个ADC数据,光累加就耗费很多周期了,但是即便如此,串口从不死机。

陶新成 发表于 2016-7-11 20:19:57

ilikemcu 发表于 2016-7-11 20:10
如果仅仅是来不及处理,那么这种应用出现的问题应该是丢包,而不是死机。
一个串口,不管怎样,硬件设计都 ...

我同意你的观点,我也是用过STM8处理器,性能很好,但由于特殊需要我用的是AT89S52,这款单片机的时钟和性能都有所欠缺,所以我想找一些处理思路

talkingbeast 发表于 2016-7-11 21:16:35

十有八九是你程序的问题

cddyy 发表于 2016-7-11 21:36:59

串口最多数据处理不过来,不会死机,可能是你的数据越界了,有没有做限制处理。

zxq6 发表于 2016-7-11 21:47:55

内存溢出的可能性很大。尝试用最小系统试试看

qd118118 发表于 2016-7-11 21:48:28

7楼说得对,我就把缓存设置得太小了,查了半天才发现

sunplus 发表于 2016-7-12 09:05:14

zxq6 发表于 2016-7-11 21:47
内存溢出的可能性很大。尝试用最小系统试试看

学习了 很好的经验

李程宏 发表于 2016-7-12 09:52:31

没有看到过串口死机的现象,应该是程序有问题,仔细检查一下。

gonboy 发表于 2016-7-12 10:03:29

程序问题

gonboy 发表于 2016-7-12 10:14:41

程序问题

zyw19987 发表于 2016-7-12 10:21:36

只是这样的描叙,估计也只能告诉你程序架构问题。

snail_dongbin 发表于 2016-7-12 10:41:19

很有可能是数组越界,串口再处理不过来 不可能死机,顶多功能不对,只要有合理的除错机制,能恢复就好。

tarzar 发表于 2016-7-12 10:57:50

使用DMA,减少单片机负担

honami520 发表于 2016-7-12 11:47:26

我的3D打印机,串口通信的。115200波特率,一秒钟几十条命令,1条5-60个字节。最快的时候一秒钟可能200条指令。
就这样,持续几十个小时的打印,都不会死机。
所以一定是你程序问题

lingdianhao 发表于 2016-7-12 12:19:43

最多就丢包,怎么能死机。

dadongleilei 发表于 2016-7-12 13:03:58

接收缓存那里可以做个保护,及时超了,大不了丢数据,不能死机

hechengzhu04 发表于 2016-7-12 13:51:32

死机,一般来说跟串口速率及发送频次没有直接关系。请楼主查一下串口中断服务程序,特别查查接收缓存数组,有没有下表越界情况。超出最大缓存后的数据一定要抛掉,否则内存溢出,会出现意想不到的问题。另外,接收完成后,解析命令的程序是否存在数组越界的情况。再有,SPI程序是否再串口程序干扰下,导致缓存溢出。这三处查查,可能会查到问题

peecehood 发表于 2016-7-12 14:18:28

不要用想的,测试出结果再来讨论也不迟。

52HLX 发表于 2016-7-12 15:52:07

检查你的串口中断接收函数,原则上只做接收数据,不做处理。可能死到串口中断函数里面了

michael.yang 发表于 2016-7-12 16:23:05

1、程序不要出现死等某标志的逻辑。
2、另外加个超时初始化处理,就是长时间串口收不到数据,就重新进行一次串口初始化。
页: [1]
查看完整版本: 单片机串口接收频率太高导致串口死机求指点