我正在使用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/

10-10 21:03