我有一台连接到COM31的设备。我创建串行连接所需的代码看起来非常简单
port = 31
trex_serial = serial.Serial(port - 1, baudrate=19200, stopbits=serial.STOPBITS_ONE, timeout=1)
当我使用Python2.6运行它时,无用的代码有效,但是当由IronPython2.6.1执行时,这就是我得到的:
Traceback (most recent call last):
File "c:\Python26\lib\site-packages\serial\serialutil.py", line 188, in __init__
File "c:\Python26\lib\site-packages\serial\serialutil.py", line 236, in setPort
File "c:\Python26\lib\site-packages\serial\serialcli.py", line 139, in makeDeviceName
File "c:\Python26\lib\site-packages\serial\serialcli.py", line 17, in device
IndexError: index out of range: 30
我不确定发生了什么。 PySerial明确表示它符合IronPython标准。 我有什么想法吗?
答案 0 :(得分:2)
IronPython正在向.NET询问端口是什么。它们的列举方式不同。就IronPython / .NET而言,您很可能要求打开一个不存在的连接。要找出“真实”端口号,请使用以下从pySerial扫描示例修改的代码。然后使用列出的COM旁边的数字。
import serial
def scan():
#scan for available ports. return a list of tuples (num, name)
available = []
for i in range(256):
try:
s = serial.Serial(i)
available.append( (i, s.portstr))
s.close() # explicit close 'cause of delayed GC in java
except serial.SerialException:
pass
#You must add this check, otherwise the scan won't complete
except IndexError as Error:
pass
for n,s in available:
print "(%d) %s" % (n,s)
return available
输出对我来说是这样的:
(0)COM9
(1)COM15
(2)COM16
(3)COM1
(4)COM15
然后当您尝试打开连接时,请使用左侧的数字而不是实际的COMportNumber - 1.例如,我需要打开与COM15的连接,因此使用上述扫描:
def IOCardConnect():
try:
connection = serial.Serial(4, 115200, timeout=1, parity=serial.PARITY_NONE)
print "Connection Succesful"
return connection
except serial.SerialException as Error:
print Error
此外,一旦连接,pySerial将期望字节写入连接,而不是字符串。所以请确保你这样发送:
#Use the built in bytes function to convert to a bytes array.
connection.write(bytes('Data_To_Send'))