仪器不通过RS232 w / ruby​​ serialport脚本

时间:2017-10-06 17:14:49

标签: ruby serial-port

我的环境

我从运行CentOS 7的笔记本电脑通过RS-232向Vivid Engineering(型号CLS-211)制作的相机模拟器设备发送命令。

问题

我已经安装了两个不同的串行监视器(minicom,gtkterm),并且可以成功地将连续命令一遍又一遍地发送到设备。我也可以发送一个命令来转储内存内容。我必须向CLS-211发送几个配置命令,以便根据特定测试进行设置。我想自动化这个过程,并编写了一个ruby脚本来向CLS-211写一个命令列表,以简化这个过程。但是,似乎我没有正确终止每个命令,或者CLS-211需要一个特定的终结符/信号,我没有在我的ruby脚本中给它。我很困惑为什么我可以使用串行监视器而不是ruby脚本成功完成此任务。我已经按照他们的手册正确配置了串口设置,所以我知道这不是问题。您将在我的scirpts中看到以下设置。他们的手册指出他们使用HyperTerminal我无法使用,因为我在Linux系统上。制造商提到其他串行终端应该可以正常工作但他们只选择测试一个超级终端。我已经问过他们对这个问题的反馈,他们只是说'#34;我们不会使用Linux但它不应该有太大的不同,祝你好运#34;。

故障排除

我已经验证了我的" send.rb"脚本通过编写" read.rb"来尽我所知。脚本回读我发送的内容。我基本上连接了引脚2" rx"引脚3" tx"在RS-232电缆上进行环回测试。下面是我的两个脚本以及运行此测试的结果输出。

## Filename send.rb

require 'serialport'
ser = SerialPort.new("/dev/ttyS0", 9600, 8, 1, SerialPort::NONE)
ser.write "LVAL_LO 5\r\n"
ser.write "LVAL_HI 6\r\n"
ser.write "FVAL_LO 7\r\n"
ser.write "FVAL_HI 8\r\n"
ser.close

## Filename read.rb

require 'serialport'
ser = SerialPort.new("/dev/ttyS0", 9600, 8, 1, SerialPort::NONE)
while true do
  printf("%c", ser.getc)
end
ser.close

刚发现我发不上2个以上的链接,因为我的名声很低。无论如何,输出只是以下......

username@hostname $ ruby read.rb
LVAL_LO 5
LVAL_HI 6
FVAL_LO 7
FVAL_HI 8

我已经连接了CLS-211并通过使用GtkTerm发出DUMP命令来转储内存内容,这样可以正常工作。下图显示前四个参数的内存内容为LVAL_LO,LVAL_HI,FVAL_LO和FVAL_HI。我只是选择在内存转储中显示四个值,以便保持此线程的简短而不是列出所有这些值。由于我不能包含超过2个链接,因为我的声誉很低,因此我在GtkTerm中键入输出的内容...

CLS-211 initializing, please wait
............
ready

CLS211 Camera Link Simulator CLI
Vivid Engineering
Rev 3.0

DUMP
LVAL_LO    = 0x0020    / 32
LVAL_HI    = 0x0100    / 256
FVAL_LO    = 0x0002    / 2
FVAL_HI    = 0x0100    / 256

在上图中,您可以清楚地看到系统按预期启动。输入命令" DUMP"它成功打印出内存内容。您会看到LVAL_LO = 32,LVAL_HI = 256,FVAL_LO = 2和FVAL_HI = 256.正如我之前提到的,我可以成功输入命令GtkTerm来更改特定参数。下图显示在输入命令LVAL_LO 5到GtkTerm然后发出DUMP命令后,正确读取值5并按预期更改LVAL_LO。我可以使用GtkTerm复制每个命令的成功行为。 同样,我不能发布超过2个链接,所以我在下面写下输出...

LVAL_LO 5
DUMP
LVAL_LO    = 0x0005    / 5
LVAL_HI    = 0x0100    / 256
FVAL_LO    = 0x0002    / 2
FVAL_HI    = 0x0100    / 256

此时我觉得一切都按预期工作。让我们看看我是否可以执行我的ruby脚本并成功复制它。然后我运行了我在上面输入的脚本" send.rb"。然后我打开了GtkTerm,然后发出了一个DUMP命令,看看是否采用了这些值。让我们知道在我跑步之前发送" send.rb" CLS-211内存中存在的值为LVAL_LO = 32,LVAL_HI = 256,FVAL_LO = 2,FVAL_HI = 256.运行" send.rb"后,可以看到打开GtkTerm备份并且发出DUMP命令,CLS-211回答w /"无效条目"。再次发出后,你会看到它转储内存的内容并显示LVAL_LO已正确更改,但其他三个值没有。 Almost Successful

此时我假设第一个值正在接收并正确写入CLS-211的内存内容,但其他命令未正确接收。我认为这很可能是因为没有任何延迟。因此,我在每个ser.write命令之间放置了1秒的延迟。我更改了脚本" send.rb"以下。

## Filename send.rb

require 'serialport'
ser = SerialPort.new("/dev/ttyS0", 9600, 8, 1, SerialPort::NONE)
ser.write "LVAL_LO 9\r\n"
sleep(1)
ser.write "LVAL_HI 10\r\n"
sleep(1)
ser.write "FVAL_LO 11\r\n"
sleep(1)
ser.write "FVAL_HI 12\r\n"
sleep(1)
ser.close

以下是运行" send.rb"的结果。再次进行上述更改,打开GtkTerm,并执行DUMP命令验证内存。 Added sleep(1)

没有什么改变。我能够告诉脚本执行的时间更长,第一个值确实发生了变化,但就像我发送的最后三个值之前没有收到并保存到CLS-211的内存中一样。

结论

如何继续解决此问题?我通过GtkTerm发送的每个命令发生了什么类型的终止,这与我在ruby脚本中发送的命令不同" send.rb"正在" ... \ r \ n"。关于我接下来要做什么,完全失去了选择权。

[编辑/更新10/09/17]

我真傻。一个终止角色,我忘了尝试自己"#34;是回车" \ r"。在每个命令修复问题后使用回车。我很好奇是什么要求驱动制造商定义如何根据终止字符构造串行数据包。我认为应该使用什么终止字符的预定义标准。为了完整起见,我将下面的代码包含在与CLS-211设备正确通信的情况下应该是什么。基本上,我拿出了' \ n'并保持' \ r'就是这样。

## Filename send.rb

require 'serialport'
ser = SerialPort.new("/dev/ttyS0", 9600, 8, 1, SerialPort::NONE)
ser.write "LVAL_LO 9\r"
sleep(1)
ser.write "LVAL_HI 10\r"
sleep(1)
ser.write "FVAL_LO 11\r"
sleep(1)
ser.write "FVAL_HI 12\r"
sleep(1)
ser.close

0 个答案:

没有答案