VB.NET串口程序ReadLine超时求助:运行12年的舵机控制应用突发报错
VB.NET 串口ReadLine超时故障修复方案
核心故障根因
运行多年后硬件老化、链路干扰概率上升,原有代码的鲁棒性不足以覆盖当前的硬件状态变化,具体问题点如下:
- 写入指令前未清空串口输入缓冲区,链路残留的无效数据会导致舵机返回的有效报文无法被
ReadLine识别到换行符,触发超时 - 固定10ms延迟、150ms读超时的配置适配性下降,舵机硬件老化后响应延迟变长,原有时间预留不足
- 超时异常触发后没有清空输入缓冲区,残留数据会导致后续读取逻辑连续出错
- 未显式指定
SerialPort的换行匹配规则,舵机老化后返回报文的换行符可能出现微小偏差,无法匹配默认规则
代码修改方案
Sub SendSerialData() CurrentPositionDisplay.BackColor = Color.White CameraServoReadOK = 0 ' 发送前清空收发缓冲区,避免残留数据干扰 CameraServoComm.DiscardOutBuffer() CameraServoComm.DiscardInBuffer() ' Send strings to CameraServo serial port. ServoCommdataOut = ServoCommdataOut & vbCr ' 适配老化硬件调整读超时为300ms,可根据实际测试调整 CameraServoComm.ReadTimeout = 300 CameraServoComm.Write(ServoCommdataOut) CameraServoReadOK = 0 If VerboseLogging = 2 Then dtString = dispDt.ToString(datePatt) outMessage = dtString & " - " & ServoCommdataOut Call WriteToLog(outLabel, outMessage) End If If outLabel = "Starting Picture Sequence " Then SkipRead = True End If ' 延迟调整为20ms适配老化硬件,可根据实际测试调整 Call DelayTimer(20) If SkipRead = False Then Try CameraServoCommDataIn = CameraServoComm.ReadLine() CameraServoReadOK = InStr(CameraServoCommDataIn, CameraServoresponseStartString, CompareMethod.Text) If CameraServoReadOK > 0 Then CameraServoStatusDataIn = CameraServoCommDataIn End If Catch ex As Exception outMessage = "Missed Read after servo write" & ex.ToString Call WriteToLog(outLabel, outMessage) ' 异常后清空输入缓冲区,避免后续读取连续出错 CameraServoComm.DiscardInBuffer() End Try End If End Sub
额外优化建议
- 在串口初始化逻辑中显式指定换行符匹配规则:
CameraServoComm.NewLine = vbCr,和舵机返回的换行格式对齐 - 可将固定延迟替换为轮询判断
CameraServoComm.BytesToRead属性,直到有数据可读再执行读取操作,进一步提升适配性 - 若调整后仍偶发超时,可尝试更换串口线、排查舵机硬件接口氧化问题,排除物理链路故障
内容的提问来源于stack exchange,提问作者Rfrank
相关产品推荐
相关产品推荐

