• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

请问在使用串口通讯的时候,该如何去判断串口超时呢?

奔跑的黑蚂蚁 2018-08-21 浏览量:2284
项目中有用到串口通讯,是用于几个数据采集点与主控器之间的信息交换,通讯协议是自定义。格式是(帧长+指令+读写标志+数据+CRC校验)。在调试的过程中发现,(由于通讯协议中没有起始字节和结束字节,但是现在协议已经不能再更改了如果没有串口超时检测的话,万一主控器或者是数据采集点的单片机正在接受串口数据时,人为断开串口线,接受数据的单片机就会一直在等待数据接收完成,从而导致数据错乱。我现在使用了一个定时器,一旦串口开始接收数据的时候,定时器就启动计时,没一毫秒中断一次,超过15毫秒数据接收没完成,就认为通讯异常,丢弃本次的数据(清除接收缓存和接收数据长度变量)不解析。我觉得应该还有其他的超时判断方法,请各位大神指教一下。
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 用一个定时中断计数器计数,如果在一帧信号里缺少一个字节计数器会超过一个值就判断出错
    • 发布于 2018-08-21
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  • hal 库函数里面,iic  spi  接收函数 api 都有超时那个参数,可以看一下库怎么实现的。官方正规的方法,借鉴意义大
    • 发布于2018-08-21
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以使用串口空闲中断,空闲时间长了,就是超时了
    • 发布于2018-08-21
    • 举报
    • 评论 1
    • 0
    • 0
奔跑的黑蚂蚁 回复了 这是经国 :目前UASRT1有空闲中断,2没有 回复

  • 常用的就是用一个定时器中断去判断超时,比如modbus就是这种机制
    • 发布于2018-08-24
    • 举报
    • 评论 0
    • 0
    • 0

  • 串口的寄存器发送函数就有判断超时的,用USARTx->ISR寄存器的第23位来判断发送时长:

    USARTx->DR=a;
    while(!USARTx->ISR&0x700)
    delay++;

    • 发布于2018-08-26
    • 举报
    • 评论 0
    • 0
    • 0

  • STM32有个串口空闲中断,叫做IDLE,这个中断可以在串口由有数据交互到出现空闲的时候产生一个中断,通过这个可以判断的
    • 发布于2018-08-31
    • 举报
    • 评论 0
    • 0
    • 0

  • 要用一个串口的超时处理,根据数据进行定时器的计时然后再判断
    • 发布于2018-09-18
    • 举报
    • 评论 0
    • 0
    • 0

  • 用一个串口的空闲中断去处理,这个中断会在传输完产生一个中断
    • 发布于2018-09-19
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

请问在使用串口通讯的时候,该如何去判断串口超时呢?