pySerial 2.6:在readline()中指定行尾

2024-06-01 05:29:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pySerial向Eddie发送命令。我需要在我的readline中指定一个回车,但是pySerial 2.6去掉了它。。。有解决办法吗?

以下是本PDF第二和第三页中列出的Eddie command set。这里是一个backup image,以防无法访问PDF。

通用命令格式:

Input:              <cmd>[<WS><param1>...<WS><paramN>]<CR>
Response (Success): [<param1>...<WS><paramN>]<CR>
Response (Failure): ERROR[<SP>-<SP><verbose_reason>]<CR> 

如您所见,所有响应都以\r结尾。我要叫皮瑟瑞停下来。

我现在拥有的:

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

Tags: 命令selfreadlinewspdfresponsecontentsp
3条回答

从端口3读取10个数据,板速率为38400,当输入数据时,数据用字符分隔

import serial as self
ser=self.Serial("COM3", 38400)  
buffer = []
count = 0.0
c = "\0"
while count < 10:
    c = "\0"
    if ser.inWaiting():
        while True:
            val = ser.read(1)
            if "\n" in val:
                break
            else:
                c += val
        buffer.append(c) # stores all data received into a list   
        count += 1
print buffer

从pyserial的documentation

(原文如此)

注:

当pySerial使用较新的Python版本(V2.6+)运行时,不再支持io模块的eol参数。 下线

要为readline()指定EOL字符或使用通用换行模式,建议使用io.TextIOWrapper

import serial
import io
ser = serial.serial_for_url('loop://', timeout=1)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))

sio.write(unicode("hello\n"))
sio.flush() # it is buffering. required to get the data out *now*
hello = sio.readline()
print hello == unicode("hello\n")

我遇到了同样的问题,实现了自己的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方法工作时遇到了thispost(谢谢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版本。

相关问题 更多 >