在Linux下,使用fdpexpect模块与串口进行交互,例如:
fd = os.open(TTY, os.O_NONBLOCK|os.O_RDWR|os.O_NOCTTY)
child = fdpexpect.fdspawn(fd)
在Windows中,如何实现上述功能?
答案 0 :(得分:4)
pyserial为串行端口提供了独立于平台的接口。
答案 1 :(得分:2)
本周末,我在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下与两个不同的嵌入式系统进行通信。
请注意,serial.Serial()构造函数在Unix下采用类似“/ dev / ttyS0”的字符串,但在Windows(包括Cygwin)下,它需要一个整数。对COM3使用int(2),对COM4使用int(3),依此类推。设备管理器将告诉您应使用哪些COM端口号。
...
最后要注意的是,如果你正在与Arduino Uno谈话......在我的Windows 7系统上,插入Arduino会导致/ dev / ttyS ##立即出现,就像人们所期望的那样。但是,在使用Arduino软件串行终端,或者Putty或者Cygwin'screen'命令打开Arduino串口之前,串口不起作用。一旦你在其中一个程序中打开它,它就可以正常工作,直到它被拔掉。我不知道为什么;它似乎是Arduino驱动程序中的一个错误。 (我的非Arduino设备使用我的FTDI驱动程序没有这个问题。)