zhouhuandev/SerialPortKit

超时处理

Closed this issue · 7 comments

发送命令后,如果下位机没反应,上位机超时不会调

发送命令后,如果下位机没反应,上位机超时不会调

需要你排查一下使用的是发送超时还是接受超时,是否使用的是成对的数据响应

目前是上位机发送命令成功,上位机接收超时不回调

检查 SerialPortHelper.sendMessage 中如何接收的消息,是否做了指令校验,读取数据线程是否正常工作

超时处理的有点问题的
SerialReadThread

// 暂停一点时间,免得一直循环造成CPU占用率过高
sleep(1)

基本上不停地读取数据,加入队列中的数据来不及发送就检查是否超时,总是提示发送数据或者接收数据超时
SerialPortHelper中的isTimeOut方法task.sendTime如果是0,是还没发送,这样直接超时不合理

超时处理的有点问题的 SerialReadThread

// 暂停一点时间,免得一直循环造成CPU占用率过高
sleep(1)

基本上不停地读取数据,加入队列中的数据来不及发送就检查是否超时,总是提示发送数据或者接收数据超时 SerialPortHelper中的isTimeOut方法task.sendTime如果是0,是还没发送,这样直接超时不合理

好哒,你反馈的问题已在处理中,将会在这里增加校验,而不单单是校验等待时间是否为 0,可以尝试增加是否已发送,是否已超过最大发送次数等检查内存。

超时处理的有点问题的 SerialReadThread

// 暂停一点时间,免得一直循环造成CPU占用率过高
sleep(1)

基本上不停地读取数据,加入队列中的数据来不及发送就检查是否超时,总是提示发送数据或者接收数据超时 SerialPortHelper中的isTimeOut方法task.sendTime如果是0,是还没发送,这样直接超时不合理

好哒,你反馈的问题已在处理中,将会在这里增加校验,而不单单是校验等待时间是否为 0,可以尝试增加是否已发送,是否已超过最大发送次数等检查内存。

BaseSerialPortTask(val addTime: Long)
BaseSerialPortTask增加addTime加入队列时间,SerialPortHelperisTimeOut方法中的修改
val sendOffset = abs(currentTimeMillis - if (task.sendTime == 0L) task.addTime else task.sendTime)
再加上上面最大发送次数等检查内存等等

超时处理的有点问题的 SerialReadThread

// 暂停一点时间,免得一直循环造成CPU占用率过高
sleep(1)

基本上不停地读取数据,加入队列中的数据来不及发送就检查是否超时,总是提示发送数据或者接收数据超时 SerialPortHelper中的isTimeOut方法task.sendTime如果是0,是还没发送,这样直接超时不合理

好哒,你反馈的问题已在处理中,将会在这里增加校验,而不单单是校验等待时间是否为 0,可以尝试增加是否已发送,是否已超过最大发送次数等检查内存。

BaseSerialPortTask(val addTime: Long) BaseSerialPortTask增加addTime加入队列时间,SerialPortHelperisTimeOut方法中的修改 val sendOffset = abs(currentTimeMillis - if (task.sendTime == 0L) task.addTime else task.sendTime) 再加上上面最大发送次数等检查内存等等

很感谢你的反馈,我经过仔细思考,这里的 isTimeOut 中判断逻辑暂无问题。
理由如下:

  1. sendBuffer 方法中,有且仅当发送成功以后才会将其 task 添加至 tasks 队列中。所以在检查任务超时方法 isTimeOut 中并不无妥当,sendTime 也可以粗略的看做是加入队列的时间。
  2. 第一层判断 task.waitTime == 0L 是为了更新一次等待时间(如果检查时尚未收到下位机响应,那么其等待时长就为 0,即在检查超时任务中更新一次等待时长),然后检查当前时间与发送时间的间隔是否超出了 task 的超时限制,得出是否发送超时,这里面使用的是一个取巧的方法,时间跨度为下位机其他任务返回数据的时候,去检查已发送完成的任务队列里的任务。严格来讲,也这里的时长等于“发送时长+下位机响应时长(包含其他任务)”
  3. 第二层 else 判断是检查是否等待接收数据超时,检查方式是通过当前任务已设置的等待时间去计算当前检查任务时候的时间差,如果这个时间差超出了限制的话,那么就会判定接收数据超时。
  4. 如果使用阻塞式接收数据的话,时间超时判断机制有可能会出现不准确的情况,如果下位机一直未响应数据的话, SerialReadThread 此时正在被阻塞,计算超时逻辑可能会出现不准确的情况(尤其是发送超时时间,因为发送超时时间=“发送时间+下位机响应时间”),建议超时时间加大一些发送超时时间。

非常感谢你提出建议,如果您有更合适的检查方式,也欢迎你列举一些建议与方案。