当前位置: 首页 > 面试题库 >

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

琴修为
2023-03-14
问题内容

我正在使用pySerial向Eddie发送命令。我需要在我的readline中指定一个回车符,但是pySerial 2.6摆脱了它…是否有解决方法?

以下是此PDF第二和第三页上列出的Eddie命令集。这是无法访问PDF的备用图片。

通用命令格式:

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方法工作时,我遇到了这篇文章。因此,可以使用以下代码来代替使用上面提到的自定义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()

确保将参数传递1BufferedRWPair,否则在每个字节导致串行连接再次超时后,它将不会将数据传递给TextIOWrapper。

设置为时line_bufferingTrue不再需要flush在每次写操作后调用函数(如果写操作以换行符终止)。

编辑:TextIOWrapper方法实际上适用于 小的
命令字符串,但其行为是不确定的,并且在传输多个字节时可能导致错误。实际上,最安全的做法是实现您自己的readline



 类似资料:
  • 稳定性: 2 - 稳定的 require('readline') 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行。 它可以通过以下方式使用: const readline = require('readline'); 例子,readline 模块的基本用法: const readline = require('readline'); const rl

  • 配置 # readline_parse_and_bind.py try: import gnureadline as readline except ImportError: import readline readline.parse_and_bind('tab: complete') readline.parse_and_bind('set editing-mode vi')

  • 问题内容: 我正在尝试在Java程序中阅读标准输入。我期望一系列数字后跟换行符,例如: 当通过eclipse内置控制台提供输入时,一切都会顺利进行。但是,使用Windows命令行时,程序将输出: 我的代码是: 有什么线索吗? 问题答案: 得到a 表示相关对象已到达EOF(文件末尾),或者换句话说,它们无法再获得任何标准输入。现在,您的代码明显的问题是: 的每个方法调用都会创建一个 新的 。 每个这

  • 描述 (Description) 此函数从EXPR引用的文件句柄中读取一行,返回结果。 如果要直接使用FILEHANDLE,则必须将其作为typeglob传递。 简单的readline函数等效于<>。 语法 (Syntax) 以下是此函数的简单语法 - readline EXPR 返回值 (Return Value) 此函数在标量上下文中仅返回一行,在列表上下文中,返回到文件结尾的行的列表 例子

  • GNU Readline 库提供了一组供应用程序使用的功能,这些功能允许用户在键入命令时编辑命令行。Emacs 和 vi 编辑模式均可用。Readline 库包含其他功能,这些功能可以维护以前输入的命令行的列表,以重新调用并可能重新编辑这些命令行,并对先前的命令执行类似 csh 的历史记录扩展。 历史记录设施也作为构建过程的一部分放置在一个单独的库中,即历史记录库。在需要 Readline 功能的

  • 我在 Ecrion 和 Apache FOP 的试用版中渲染了相同的 XSL-FO,您会注意到这两个渲染器在第 2 行和第 3 行上产生了不同的行长。Ecrion 渲染文本的方式就是我希望 Apache FOP 这样做的方式。 我是否可以将属性添加到