Ruby SerialPort似乎没有初始化

时间:2012-02-15 01:49:27

标签: ruby

我正在使用Ruby 1.8.7 SerialPort gem通过FTDI232 USB转串口转换器与AVR进行通信。我似乎遇到了SerialPort初始化新SerialPort的问题。

我发现当我打开与Windows上的PuTTY或Linux上的Minicom的连接并以这种方式发送命令时,一切正常。

我也注意到在关闭PuTTY / Minicom后,我的代码运行正常。因此,我开始相信有些东西不能正常使用SerialPort gem如何初始化串行连接。

是否有其他人遇到此问题或对如何解决此问题有任何想法?

编辑: 这是一个代码示例。     要求'rubygems'     要求'serialport'

sp = SerialPort.new("COM5", 115200)
sp.print("A\r")
data = sp.readline("\r\n")
puts data
sp.close

此代码应打开一个连接并发送一个字符,指示我的AVR所需的数据类型。然后它等待传回数据,并将其打印到屏幕上。

当我的设备最初连接时,代码只是在读取时挂起,但在停止脚本后,打开与PuTTY的连接,关闭PuTTY连接,脚本完全按照预期进行操作。

3 个答案:

答案 0 :(得分:0)

在Windows中,一次只能有一个进程连接到串行端口。我不确定Linux。

确保在代码中正确设置波特率。

如果您仍然遇到问题,请发布一些非常简单的示例代码,以及对预期行为和实际行为的描述。

答案 1 :(得分:0)

我很确定我已经解决了我的问题。添加read_timeout似乎已修复它。

sp = SerialPort.new("COM5", 115200)
sp.read_timeout = 1500

使用PuTTY / Minicom必须有一些如何设置它并在关闭后离开它。

答案 2 :(得分:0)

我在Linux debian 3.1.0-1-amd64上遇到了同样的问题。

该问题与ftdi_sio内核模块中引入的错误相关(谷歌搜索“USB ftdi驱动程序ftdi_sio.c中的修复损坏问题”)。

我已应用补丁(请参阅https://lkml.org/lkml/2012/2/1/574)重建模块ftdi_sio.ko,问题现已解决。

  1. 获取内核源码linux-3.1.10.tar.bz2(我的实际内核是3.1.0-1-amd64)。

  2. 应用补丁

  3. 重新编译模块(示例如何在http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html中执行)

  4. 备份原始模块 /lib/modules/3.1.0-1-amd64/kernel/drivers/usb/serial/ftdi_sio.ko 并用新的替换它。

  5. 重新启动

  6. 快速而肮脏的解决方法也可以强制更改波特率(不需要重新编译内核模块):

    sp = SerialPort.new("/dev/ttyUSB0")
    sp.baud=300 #value which is not often used
    sp.baud=9600
    

    ...