靛尊 发表于 2025-6-3 09:51:46

Serial函数库setTimeout导致FTDI USB转串口失去响应

之前在客户那里调试设备,控制器上用的FTDI的USB转串口芯片。上位机需要和控制器进行指令交互,然后不同的指令的超时时间不同,因此需要在打开串口后修改超时时间。但是调试下来发现,串口通信变得很不稳定,非常容易收不到数据。
困扰了一段时间后,果断抓包看USB转串口的数据包,一看吓一跳setTimeout发送之后,系统再不停地重新配置USB转串口的各项参数,包括波特率,数据位等等。明明我只需要配置超时,却相当于重新开关了一遍串口。

void Serial::SerialImpl::setTimeout (serial::Timeout &timeout)
{
  timeout_ = timeout;
  if (is_open_) {
    reconfigurePort ();
  }
}查看serial库的源码发现,这货真的牛啊,直接调用了reconfigurePort来配置超时,所以抓包setTimeout时的数据有一堆配置波特率的东西。

我们只需要修改超时时间,因此修改这个函数就可以解决问题,只单纯的改变超时的等待时间
void Serial::SerialImpl::setTimeout (serial::Timeout &timeout)
{
timeout_ = timeout;
if (is_open_) {
    //reconfigurePort ();
    // Setup timeouts
    COMMTIMEOUTS timeouts = { 0 };
    timeouts.ReadIntervalTimeout = timeout_.inter_byte_timeout;
    timeouts.ReadTotalTimeoutConstant = timeout_.read_timeout_constant;
    timeouts.ReadTotalTimeoutMultiplier = timeout_.read_timeout_multiplier;
    timeouts.WriteTotalTimeoutConstant = timeout_.write_timeout_constant;
    timeouts.WriteTotalTimeoutMultiplier = timeout_.write_timeout_multiplier;
    if (!SetCommTimeouts(fd_, &timeouts)) {
      THROW(IOException, "Error setting timeouts.");
    }
}
}
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

百里宵月 发表于 2025-10-10 01:15:34

喜欢鼓捣这些软件,现在用得少,谢谢分享!

鞍注塔 发表于 2025-10-30 13:26:13

谢谢楼主提供!

喳谍 发表于 2025-11-11 02:48:45

感谢,下载保存了

忙贬 发表于 2025-12-28 21:20:43

这个有用。

忿惺噱 发表于 2025-12-29 08:55:22

很好很强大我过来先占个楼 待编辑

后仲舒 发表于 2025-12-31 09:27:27

热心回复!

厂潺 发表于 2026-1-1 13:39:44

谢谢楼主提供!

孜尊 发表于 2026-1-9 18:48:37

很好很强大我过来先占个楼 待编辑

辉伫 发表于 2026-1-13 16:06:06

感谢分享,学习下。

烯八 发表于 2026-1-17 12:22:57

感谢分享,学习下。

猷浮 发表于 2026-1-18 16:35:48

前排留名,哈哈哈

盗衍 发表于 2026-1-18 18:26:18

谢谢楼主提供!

梁宁 发表于 2026-1-20 00:55:32

用心讨论,共获提升!

巴沛若 发表于 2026-1-20 14:31:45

过来提前占个楼

申倩语 发表于 2026-1-20 15:49:31

新版吗?好像是停更了吧。

汤流婉 发表于 2026-1-21 00:03:31

不错,里面软件多更新就更好了

沦嘻亟 发表于 2026-1-23 01:09:48

很好很强大我过来先占个楼 待编辑

上官泰 发表于 2026-1-24 06:12:16

这个有用。

段干叶农 发表于 2026-1-24 06:46:31

这个好,看起来很实用
页: [1] 2
查看完整版本: Serial函数库setTimeout导致FTDI USB转串口失去响应