0

首先,我对 python 和 Linux 都很陌生。也就是说,我正在尝试使用 pylibftdi 库与 FTDI UM232H 芯片通信。我在 Linux Ubuntu 12.04 上运行我的脚本。我安装了我在这里得到的库:http: //pylibftdi.readthedocs.org/en/latest/ ,显然一切正常。我还能够成功运行一些示例。

然后我尝试编写一些代码来与设备通信:我将它连接到总线供电配置中(为了从 USB 获取电源),然后我将 TX 和 RX 引脚短路,这样我在 TX 上发送的内容将在 RX 上读回。我没有收到任何错误,但我无法在 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 信息。

有人知道我做错了什么吗?有没有其他人遇到过这样的问题?提前致谢!

4

1 回答 1

0

恐怕我没有完整的答案,但有一些观察(我会让这个更简洁并作为评论,但我没有足够的代表)。

免责声明:我是 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。


如果我发现更多信息,我将继续调查并更新此答案。

于 2013-11-03T23:16:56.220 回答