为何设置1小时SerialPort.ReadTimeout后超时提示未触发?
问题根源与修复方案
核心错误:超时单位误解
SerialPort.ReadTimeout的单位是毫秒,不是分钟或小时:
- 原代码
60*1000*5计算的是300000毫秒,对应5分钟,符合你的预期。 - 改成
60后,实际仅设置了60毫秒(0.06秒)的超时,和你想要的1小时完全不符。
为什么改后没触发错误提示?
- 极短的超时可能导致
check_connection_sensor()内的串口操作还没进入等待读取的阶段就完成了流程,根本没触发超时异常。 - 如果
check_connection_sensor()内部有自己的try/catch块,可能把TimeoutException拦截并处理了,没传递到外层的catch逻辑里。
修复步骤
- 修正超时值:要设置1小时超时,正确代码是:
mySerialPort.ReadTimeout = 60 * 1000 * 60; // 3600000毫秒 = 1小时 - 排查异常捕获逻辑:检查
check_connection_sensor()方法内部是否有未对外抛出的异常处理,确保TimeoutException能传递到外层的catch块。 - 添加调试日志:在
check_connection_sensor()里添加日志输出,跟踪串口读取的状态,确认超时是否被触发,比如:// 在check_connection_sensor内部读取串口前添加 Console.WriteLine($"当前ReadTimeout设置:{mySerialPort.ReadTimeout}毫秒");
内容的提问来源于stack exchange,提问作者Blind Bandit
相关产品推荐
相关产品推荐

