我正在使用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连接,脚本完全按照预期进行操作。
答案 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,问题现已解决。
获取内核源码linux-3.1.10.tar.bz2(我的实际内核是3.1.0-1-amd64)。
应用补丁
重新编译模块(示例如何在http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html中执行)
备份原始模块 /lib/modules/3.1.0-1-amd64/kernel/drivers/usb/serial/ftdi_sio.ko 并用新的替换它。
重新启动
快速而肮脏的解决方法也可以强制更改波特率(不需要重新编译内核模块):
sp = SerialPort.new("/dev/ttyUSB0")
sp.baud=300 #value which is not often used
sp.baud=9600
...
属