首先,我对python和Linux都很新。 这就是说我正在尝试使用pylibftdi库与FTDI UM232H芯片进行通信。 我在Linux Ubuntu 12.04上运行我的脚本。 我安装了我在这里的图书馆: http://pylibftdi.readthedocs.org/en/latest/ 显然一切都很好。 我也能够成功运行一些例子。
然后我尝试编写一些代码与设备通信:我将它连接到总线供电配置(为了从USB获得电源),然后我将TX和RX引脚短路,这样我发送的内容在TX上将读回TX。 我没有收到任何错误,但我无法读回RX上的任何内容。 这是我非常简单的代码:
import pylibftdi as p
import time
test = p.Driver()
print test.list_devices()
#This is not working
#print test.libftdi_version()
dev1 = p.Device(device_id='FTUBL36A', mode='t')#, chunk_size = 0)
dev1.flush()
dev1.baudrate = 9600
len = dev1.write('Hello World')
time.sleep(1)
res = dev1.read(len)
print 'res: ', res
即使我安装了libftdi_verion信息,也无法获取它。
有没有人知道我做错了什么?还有其他人遇到过这样的问题吗? 提前谢谢!
答案 0 :(得分:0)
我担心我没有完整的答案,但有些观察(我会更简洁并作为评论,但我没有足够的代表)。
免责声明:我是pylibftdi的作者
Ubuntu libftdi软件包(甚至是最新的13.10)是0.20。由于Ubuntu软件包名称为'libftdi1',因此特别令人困惑/恼人。在(真实)libftdi 1.0之前,没有ftdi_get_library_version()函数,因此libftdi_version()
将不能与Ubuntu默认包一起使用。 pylibftdi的下一个版本识别出这一点并给出适当的响应。
要安装1.0,请按照http://developer.intra2net.com/mailarchive/html/libftdi/2013/msg00014.html上的说明操作(例如以下内容对我有用 - 请注意我之前安装了Ubuntu libftdi1
软件包,可能还需要其他依赖项):
$ sudo apt-get install cmake libusb-1.0
$ git clone git://developer.intra2net.com/libftdi
$ cd libftdi
$ git checkout tags/v1.0
$ mkdir build; cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig # ensure the new library is recognised
在此之后,获取库版本应该有效:
$ python -c 'from pylibftdi import Driver; print Driver().libftdi_version()'
(1, 0, 0, '1.0', 'v1.0')
请注意,最新的libftdi(重复上述内容但使用git checkout master
)似乎对我来说效果稍好一些,并且上面的程序对我来说非常适合使用UM232H(我显然省略了device=...
参数,但在其他方面保持不变)。如果我用'Hello World'
替换'Hello World' * 10
,写入并读取更长的字符串,则返回截断值,通常只有29个字节。我不确定为什么这个价值;使用早期的libftdi版本,它似乎一致地返回17个字节。很奇怪。
对于其他设备(UB232R,UM232R),这一切都按预期完美运行,因此在(不可否认)事件中您可以选择设备,您可以考虑切换...注意FT232H芯片相对较新且支持在libftdi中可能不像旧设备那样坚固 - 但同样可能的是我错误地认为它应该以类似于pylibftdi中旧设备的方式工作。
我已经尝试将ftdi_sio
列入黑名单(将blacklist ftdi_sio
添加到/etc/modprobe.d/blacklist.conf
的末尾),这会阻止Linux内核对插件上的设备做什么知道它在(没有这个插入时,Rx / Tx LED闪烁几次,并且ftdi_sio模块已加载。我不确定这是必要的还是有所作为。
请注意,由于设备内部缓冲以及各种驱动程序层(包括设备内部缓冲),无法保证read()将返回先前写入设备的任何内容(假设外部Tx-> Rx环回) USB)。这些只是流,框架应该在应用程序层中完成。话虽如此,它“只适用于UB232R”,即使考虑到这一点,UM232H似乎也存在pylibftdi串行模式的问题。
Bitbang模式似乎适用于UM232H / pylibftdi。
如果我发现更多内容,我会继续调查并更新此答案。