单片机串口接收频率太高导致串口死机求指点
单片机串口波特率设置在115200,100HZ接收和处理外来数据包然后通过SPI发出,现象是处理一两分钟串口就不再发数了我想可能是单片机波特率和通信频率过高导致单片机串口工作异常,希望大家给解释一下愿意,提供一些思路 降低波特率~~~~~~~~~~~~~~缩短2机之间的距离 lxa0 发表于 2016-7-11 19:57
降低波特率~~~~~~~~~~~~~~缩短2机之间的距离
这个有一定困难,产品是固化的,只能单片机这边想办法了 如果仅仅是来不及处理,那么这种应用出现的问题应该是丢包,而不是死机。
一个串口,不管怎样,硬件设计都已经非常成熟了,而且现在的8位机,即使如STC这样的国产芯片,速度也是非常之快,处理楼主所述的数据应该是不存在多大问题,建议还是从程序框架结构,和逻辑处理上下手,2,3年前我用曾经用STM8L的芯片,ADC以700多KSPS的速率DMA采样,然后每0.5mS的数据累加求平均值以后,从串口发出去,波特率也是115200bps,之所以没有使用STM8L理论极限1MSPS的ADC采样,就是因为MCU实在来不及处理0.5mS里出来的500个ADC数据,光累加就耗费很多周期了,但是即便如此,串口从不死机。 ilikemcu 发表于 2016-7-11 20:10
如果仅仅是来不及处理,那么这种应用出现的问题应该是丢包,而不是死机。
一个串口,不管怎样,硬件设计都 ...
我同意你的观点,我也是用过STM8处理器,性能很好,但由于特殊需要我用的是AT89S52,这款单片机的时钟和性能都有所欠缺,所以我想找一些处理思路 十有八九是你程序的问题 串口最多数据处理不过来,不会死机,可能是你的数据越界了,有没有做限制处理。 内存溢出的可能性很大。尝试用最小系统试试看 7楼说得对,我就把缓存设置得太小了,查了半天才发现 zxq6 发表于 2016-7-11 21:47
内存溢出的可能性很大。尝试用最小系统试试看
学习了 很好的经验 没有看到过串口死机的现象,应该是程序有问题,仔细检查一下。 程序问题 程序问题 只是这样的描叙,估计也只能告诉你程序架构问题。 很有可能是数组越界,串口再处理不过来 不可能死机,顶多功能不对,只要有合理的除错机制,能恢复就好。 使用DMA,减少单片机负担 我的3D打印机,串口通信的。115200波特率,一秒钟几十条命令,1条5-60个字节。最快的时候一秒钟可能200条指令。
就这样,持续几十个小时的打印,都不会死机。
所以一定是你程序问题 最多就丢包,怎么能死机。 接收缓存那里可以做个保护,及时超了,大不了丢数据,不能死机 死机,一般来说跟串口速率及发送频次没有直接关系。请楼主查一下串口中断服务程序,特别查查接收缓存数组,有没有下表越界情况。超出最大缓存后的数据一定要抛掉,否则内存溢出,会出现意想不到的问题。另外,接收完成后,解析命令的程序是否存在数组越界的情况。再有,SPI程序是否再串口程序干扰下,导致缓存溢出。这三处查查,可能会查到问题 不要用想的,测试出结果再来讨论也不迟。 检查你的串口中断接收函数,原则上只做接收数据,不做处理。可能死到串口中断函数里面了 1、程序不要出现死等某标志的逻辑。
2、另外加个超时初始化处理,就是长时间串口收不到数据,就重新进行一次串口初始化。
页:
[1]