我正在使用pySerial向Eddie发送命令。我需要在我的读取行中指定回车符,但是pySerial 2.6摆脱了它...是否有解决方法?
这是Eddie command set在此PDF的第二页和第三页上列出的。在无法访问PDF的情况下,这是backup image。
通用命令格式:
Input: <cmd>[<WS><param1>...<WS><paramN>]<CR>
Response (Success): [<param1>...<WS><paramN>]<CR>
Response (Failure): ERROR[<SP>-<SP><verbose_reason>]<CR>
如您所见,所有响应都以
\r
结尾。我需要告诉pySerial停止。我现在所拥有的:
def sendAndReceive(self, content):
logger.info('Sending {0}'.format(content))
self.ser.write(content + '\r')
self.ser.flush();
response = self.ser.readline() # Currently stops reading on timeout...
if self.isErr(response):
logger.error(response)
return None
else:
return response
最佳答案
我遇到了同样的问题,并实现了我自己的readline()函数,该函数是我从pyserial软件包中的serialutil.py文件复制并修改的。
串行连接是此函数所属的类的一部分,并保存在属性'self.ser'中
def _readline(self):
eol = b'\r'
leneol = len(eol)
line = bytearray()
while True:
c = self.ser.read(1)
if c:
line += c
if line[-leneol:] == eol:
break
else:
break
return bytes(line)
与等待超时相比,这是一个更安全,更好和更快的选择。
编辑:
尝试使io.TextIOWrapper方法正常工作时,我遇到了this帖子(感谢zmo)。
因此,您可以使用以下方法来代替使用上面提到的自定义readline函数:
self.ser = serial.Serial(port=self.port,
baudrate=9600,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=1)
self.ser_io = io.TextIOWrapper(io.BufferedRWPair(self.ser, self.ser, 1),
newline = '\r',
line_buffering = True)
self.ser_io.write("ID\r")
self_id = self.ser_io.readline()
确保将参数
1
传递给BufferedRWPair
,否则在每个字节导致串行连接再次超时后,它不会将数据传递给TextIOWrapper。将
line_buffering
设置为True
时,您无需在每次写入后调用flush
函数(如果写入以换行符终止)。编辑:
TextIOWrapper方法在实践中适用于小的命令字符串,但是其行为是不确定的,并且在传输多个字节时可能导致errors。最安全的做法实际上是实现自己的
readline
版本。关于python - pySerial 2.6 : specify end-of-line in readline(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16470903/