恐怕我没有完整的答案,但有一些观察(我会让这个更简洁并作为评论,但我没有足够的代表)。
免责声明:我是 pylibftdi 的作者
libftdi 版本/安装
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上的说明进行操作(例如,以下内容对我有用 - 注意我之前安装了 Ubuntulibftdi1
软件包,以及其他可能需要依赖项):
$ 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')
UM232H 数据读取错误
请注意,最新的 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 模块是已加载。我不确定这是必要的还是有所作为。
请注意,由于设备中的内部缓冲和各种驱动程序层(包括 USB),无法保证 read() 将返回之前写入设备的任何内容(假设外部 Tx->Rx 环回)。这些只是流,框架应该在应用层完成。话虽如此,它在 UB232R 上“正常工作”,即使考虑到这一点,UM232H 似乎在串行模式下也存在 pylibftdi 问题。
Bitbang 模式似乎适用于 UM232H / pylibftdi。
如果我发现更多信息,我将继续调查并更新此答案。