Linux下,使用fdpexpect模块与串口进行交互,如:
fd = os.open(TTY, os.O_NONBLOCK|os.O_RDWR|os.O_NOCTTY)
child = fdpexpect.fdspawn(fd)
在 Windows 中,如何实现上述内容?
pyserial为串口提供了一个平台无关的接口。
这个周末我刚刚在 Windows 7 上完成了这项工作。我是这样做的:
首先,fdpexpect 模块似乎是在 Python 2.7 中与串口“聊天”的唯一方式。最新的 Python pexpect 模块文档说它可以采用整数 (int) 文件描述符(如 fdpexpect),但它不适用于我的 Ubuntu 12.10 安装。所以看起来 fdpexpect 是要走的路。如果来自:
http://www.opensource.apple.com/source/lldb/lldb-69/test/pexpect-2.4/fdpexpect.py
其次,fdpexpect 模块需要文件描述符作为输入。尽管 Python Pyserial 模块(“import serial”)它是跨平台的,但要将其与 fdpexpect 一起使用,必须使用 Serial.fileno() 方法来获取串行端口的 int 文件描述符。但是 Windows Python 中不存在 Serial.fileno() 方法;它只存在于使用整数文件描述符的 POSIX Python 中。
幸运的是,可以使用 Cygwin 使其工作。Cygwin 是一个免费的类似 POSIX 的 Windows 操作系统环境。运行 Cygwin setup.exe 并选择以下 Cygwin 包:
python
nano
wget
然后在 Cygwin Bash shell 提示符下运行以下命令:
# Install 'distribute', so we can use it to install 'pip':
wget.exe http://python-distribute.org/distribute_setup.py
# Execute the downloaded script:
python distribute_setup.py
# Now do the 'pip' installer:
wget --no-check-certificate https://raw.github.com/pypa/pip/master/contrib/get-pip.py
python get-pip.py
# Install pyserial for serial comms w/pexpect support via Serial.fileno()
pip install pyserial
现在,如果您在 Cygwin Python 安装(而不是 Windows 原生 Python)下运行 Python 脚本,您可以将 Serial.fileno() 的输出传递给 fdpexpect,并与 sendline() 和 expect() 通信。我正在使用这种方法在 Windows 下与两个不同的嵌入式系统进行通信。
请注意,在 Unix 下,serial.Serial() 构造函数采用类似“/dev/ttyS0”的字符串,但在 Windows(包括 Cygwin)下,它需要一个整数。对 COM3 使用 int(2),对 COM4 使用 int(3),依此类推。设备管理器会告诉您应该使用哪些 COM 端口号。
...
最后一点,如果您正在与 Arduino Uno 交谈……在我的 Windows 7 系统上,插入 Arduino 会导致 /dev/ttyS## 立即出现,就像人们期望的那样。但是,在您使用 Arduino 软件串行终端、OR Putty 或 Cygwin 'screen' 命令打开 Arduino 串行端口之前,串行端口不起作用。一旦你在其中一个程序中打开它,它就可以正常工作,直到它被拔掉。我不知道为什么;这似乎是 Arduino 驱动程序中的一个错误。(在我的非 Arduino 设备上使用我的 FTDI 驱动程序时,我没有这个问题。)