【问题标题】:Why do I need to query twice for correct reply using serial port in Matlab?为什么我需要在 Matlab 中使用串口查询两次才能得到正确回复?
【发布时间】:2024-01-14 15:35:02
【问题描述】:

我需要与只有串行接口 (RS-232) 的旧温度控制器通信。 我正在使用 Matlab,我的电脑没有串口。因此,我使用的是串口转 USB 适配器。

经过几个小时的挣扎,我终于建立了连接。但我总是需要查询两次才能得到我期望的答复。

例如:

询问温度(最后一个查询也是温度)

>> query(s,'in_pv_00')
ans =
      23.49

询问温度

>> query(s,'in_pv_00')
ans =
      23.49

询问版本

>> query(s,'version')
ans =
      23.49

我仍然得到温度值 然后,如果我再次查询版本

>> query(s,'version')
ans =
      JULABO HIGHTECH D-SERIES VERSION 4.0

终于拿到版本了 现在,要求临时,我仍然会在获得临时之前再获得一次版本

>> query(s,'in_pv_00')
ans =
      JULABO HIGHTECH D-SERIES VERSION 4.0
>> query(s,'in_pv_00')
ans =
      23.49

这是我使用的端口设置

s = serial('COM6');
set(s,'BaudRate',4800,'DataBits',7,'StopBits',1);
set(s,'Parity','even','Terminator',{'CR','CR'},'FlowControl','hardware');
fopen(s);

【问题讨论】:

  • 唯一对我来说看起来很奇怪的东西(不是专门的 matlab 人,但我已经做了很多 COM 端口调试) set(s,'Parity','even','Terminator',{' CR','CR'},'FlowControl','硬件');为什么是 CR CR,通常你会看到类似 CR、LF 或 Linux 系统的 LF,但这完全取决于设备配置为通过该串行端口进行的操作。还要仔细检查主机和与串行端口通信的设备之间的波特率、数据位、停止位和奇偶校验是否正确。
  • 我将波特率、数据位、停止位和奇偶校验设置为温度控制器手册中的值,并检查它们是否仍以这种方式设置。我从 matlab 脚本中获得的 CR CR,该脚本在具有真正串行端口的旧 PC 上运行并且正在工作。这也是我的第一个猜测,但是当我将其更改为 LF 时,它根本不起作用。我会尝试你的其他建议。
  • 如果你能找到温度控制器的手册,它可能会告诉你发生了什么。似乎终结符是这里的问题,但我不确定 set() 在 MatLab 中究竟做了什么我会在这里看看*.com/questions/14233394/… 尝试 Mirco Widmer 的建议,除了 fscanf 希望文件会填充一些东西。然后用 hexEditor 打开文件,看看行尾是什么。既然你确实收到了数据,我不得不想象你的 Baudrate/DataBits 和 StopBits 设置正确。
  • 我会尝试使用 Bray 终端之类的工具来确认传输和接收的字符。 sites.google.com/site/terminalbpp
  • 感谢您的帮助,虽然我无法弄清楚罪魁祸首是什么,但现在可以了。我从一开始就刷新缓冲区,之后就没有问题了

标签: matlab serial-port


【解决方案1】:

我仍然找不到该行为的罪魁祸首。
但是每当我开始测量时我都会刷新缓冲区,并且到目前为止还没有以这种方式发生错误。

【讨论】: