9

按照在 Linux 中重置串行端口的示例,我想翻译以下代码段

fd = open(filename, O_WRONLY);
ioctl(fd, USBDEVFS_RESET, 0);
close(fd);

进入有效的python代码。这是我到目前为止尝试过的

file_handler = open(self._port, 'w')
fcntl.ioctl(file_handler, termios.USBDEVFS_RESET)
file_handler.close()

以错误结束'module' object has no attribute 'USBDEVFS_RESET'termios 文档在这一点上不是很有帮助,因为它没有列出termios. 另请参阅fcntl 文档termios以获取此类属性的示例。

如何正确地将 C 代码“转换”为 python2.7 代码?

4

3 回答 3

11

我在寻找如何执行 USBDEVFS_RESET 时遇到了这个问题,并认为我会分享我对 _IO 的发现: https ://web.archive.org/web/20140430084413/http://bugcommunity.com/wiki/index.php /Develop_with_Python#Introduction_to_ioctl_calls_in_python

所以,到目前为止,我有以下内容:

from fcntl import ioctl

busnum = 1
devnum = 10

filename = "/dev/bus/usb/{:03d}/{:03d}".format(busnum, devnum) 

#define USBDEVFS_RESET             _IO('U', 20)
USBDEVFS_RESET = ord('U') << (4*2) | 20

fd = open(filename, "wb")
ioctl(fd, USBDEVFS_RESET, 0)
fd.close()

您可以busnumdevnum.lsusb

编辑:以上链接已失效,URL 已替换为最后一个存档版本。

于 2013-10-22T01:43:53.317 回答
6

ioctl-opt ( pypi ) 是一个小型 python 模块,将所需的 C 预处理器宏转换为 python。有关简单的使用示例,请参阅此hidraw实现。

请注意,可能需要定义 ctype 结构(取决于调用类型),因此您可以实际传递参数。

披露:我是这两个模块的作者。

于 2015-02-13T07:28:06.607 回答
0

USBDEVFS_RESET是在某个系统头文件中定义的。

您可以搜索它并替换termios.USBDEVFS_RESET为实际值。

于 2013-01-31T13:06:11.610 回答