Ruby SerialPort似乎没有初始化

问题描述:

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

我发现什么是当我打开Linux上,无论是腻子在Windows或小型机的连接,并发送命令这样,一切正常,因为它应该。

我也注意到,关闭腻子/小型机后,我的代码工作正常。因此,我被引导认为,串行端口初始化串行连接的方式不能正常工作。

有没有其他人遇到此问题或有任何想法,如何解决呢?

编辑: 下面是一个代码示例。 需要“RubyGems的” 需要“的SerialPort”

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

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

当我的设备最初连接代码只是挂在读,但停止脚本,打开用腻子连接,关闭连接的PuTTY脚本不正是它应该是后。

+0

也许只有一个进程可以一次控制串口? – 2012-02-15 01:54:52

+0

我不是在同一时间打开它们。如果我拔下电缆然后重新连接,我的代码将无法工作。如果我使用PuTTY/Minicom打开连接,然后关闭连接,然后再次运行我的ruby代码,我的ruby代码完全按照它应有的工作。对不起,我重新阅读了我的文章,并理解了这种混淆。 – idorko 2012-02-15 02:27:38

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

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

如果你仍然有问题,发布了一些非常简单的示例代码,与预期行为的描述和实际行为一起。

+0

我不想用多个进程来控制串口。如果我断开电缆,重新连接并运行我的Ruby代码挂起。如果我停止了我的代码,使用PuTTY打开一个连接,关闭PuTTY连接,然后再次运行我的Ruby代码,我的Ruby代码正常工作。 – idorko 2012-02-15 02:38:40

+0

另外我已经仔细检查波特率是否适当设置。 – idorko 2012-02-15 02:46:54

+1

然后发布一些非常简单的示例代码,以及对预期行为和实际行为的描述。 – 2012-02-15 02:48:30

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

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

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

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

该问题与ftdi_sio内核模块中引入的错误有关(google为“Fix ftruption issue in USB ftdi driver 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. 重启

一个快速和肮脏的解决方法可以也很给力的波特率的变化(不不需要重新编译内核模块):

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

...

sp。