使用pyserial转COM口编程
Using pyserial to COM port programming
两周前,我在我的大学里做了一个项目。我必须从连接在 COM 端口上的 METEX 设备读取温度。我决定使用 Python 的 pyserial。我在网上找到了几个例子,并根据它们做了这样的东西:
import serial
ser = serial.Serial(
port='\.\COM1',
baudrate=1200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.SEVENBITS,
timeout=5
)
if ser.isOpen():
ser.close()
ser.open()
ser.write('D')
s=ser.read(13)
print s
ser.close
它不起作用,但它应该起作用。通常,当您向它发送 'D' 字符时,该设备会向您的计算机发送 13 个字节包含温度。尽管我尝试更改代码和系统配置中的所有内容,但我无法解决此问题。我的讲师也帮不了我,因为他不在 Python 工作。他试过是因为他向我展示了他用 C 编写的旧程序,但他只有没有代码的 exec 文件。程序在我执行 Python 脚本的同一台计算机上运行,因此我确信 COM 端口、设备和系统工作正常。
今天,我不小心在代码中添加了这个:
import time
import serial
ser = serial.Serial(
port='\.\COM1',
baudrate=1200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.SEVENBITS,
timeout=5
)
ser.setRTS(False)
time.sleep(0.5)
ser.setRTS(True)
time.sleep(0.5)
ser.setRTS(False)
if ser.isOpen():
ser.close()
ser.open()
ser.write('D')
s=ser.read(13)
print s
ser.close
现在可以完美运行了。为什么??!!
我必须从这个练习中得出报告并逐行描述我的代码。请帮帮我。
操作系统:Windows XP。
我想您正在使用的 Metex 设备期望 RTS 为 'False' 或脉冲 false-true-false。
这里有一些关于 Metex 14 字节协议的信息:http://sigrok.org/wiki/Multimeter_ICs#Metex_14-byte_ASCII
一种非常简单的调查方法是在您的 PC 上使用终端程序(允许您控制 RTS 的程序)手动与 Metex 仪表共同免疫,并查看 RTS 必须达到什么级别才能获得Metex 设备响应 D.
两周前,我在我的大学里做了一个项目。我必须从连接在 COM 端口上的 METEX 设备读取温度。我决定使用 Python 的 pyserial。我在网上找到了几个例子,并根据它们做了这样的东西:
import serial
ser = serial.Serial(
port='\.\COM1',
baudrate=1200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.SEVENBITS,
timeout=5
)
if ser.isOpen():
ser.close()
ser.open()
ser.write('D')
s=ser.read(13)
print s
ser.close
它不起作用,但它应该起作用。通常,当您向它发送 'D' 字符时,该设备会向您的计算机发送 13 个字节包含温度。尽管我尝试更改代码和系统配置中的所有内容,但我无法解决此问题。我的讲师也帮不了我,因为他不在 Python 工作。他试过是因为他向我展示了他用 C 编写的旧程序,但他只有没有代码的 exec 文件。程序在我执行 Python 脚本的同一台计算机上运行,因此我确信 COM 端口、设备和系统工作正常。
今天,我不小心在代码中添加了这个:
import time
import serial
ser = serial.Serial(
port='\.\COM1',
baudrate=1200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_TWO,
bytesize=serial.SEVENBITS,
timeout=5
)
ser.setRTS(False)
time.sleep(0.5)
ser.setRTS(True)
time.sleep(0.5)
ser.setRTS(False)
if ser.isOpen():
ser.close()
ser.open()
ser.write('D')
s=ser.read(13)
print s
ser.close
现在可以完美运行了。为什么??!! 我必须从这个练习中得出报告并逐行描述我的代码。请帮帮我。
操作系统:Windows XP。
我想您正在使用的 Metex 设备期望 RTS 为 'False' 或脉冲 false-true-false。
这里有一些关于 Metex 14 字节协议的信息:http://sigrok.org/wiki/Multimeter_ICs#Metex_14-byte_ASCII
一种非常简单的调查方法是在您的 PC 上使用终端程序(允许您控制 RTS 的程序)手动与 Metex 仪表共同免疫,并查看 RTS 必须达到什么级别才能获得Metex 设备响应 D.