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

pyserial-如何读取从串行设备发送的最后一行

苏法
2023-03-14
问题内容

我将Arduino连接到运行循环的计算机,每100毫秒通过串行端口将值发送回计算机。

我想制作一个Python脚本,该脚本仅每隔几秒钟从串行端口读取一次,因此我希望它仅查看Arduino发送的最新消息。

您如何在Pyserial中做到这一点?

这是我尝试的无效代码。它顺序读取行。

import serial
import time

ser = serial.Serial('com4',9600,timeout=1)
while 1:
    time.sleep(10)
    print ser.readline() #How do I get the most recent line sent from the device?

问题答案:

也许我误会了您的问题,但是由于它是一条串行线路,因此您必须按顺序读取Arduino发送的所有内容-将其缓存在Arduino中,直到您读取它为止。

如果您希望状态显示显示最新发送的信息,请使用在您的问题中包含代码的线程(减去睡眠),并保持最后一条完整的行作为Arduino的最新行。

更新:
mtasic的示例代码相当不错,但是如果Arduino在inWaiting()调用时发送了部分行,则会截断行。相反,您要做的是将最后一条 完整
行放入中last_received,并保留部分行,buffer以便可以将其附加到下一次循环中。像这样:

def receiving(ser):
    global last_received

    buffer_string = ''
    while True:
        buffer_string = buffer_string + ser.read(ser.inWaiting())
        if '\n' in buffer_string:
            lines = buffer_string.split('\n') # Guaranteed to have at least 2 entries
            last_received = lines[-2]
            #If the Arduino sends lots of empty lines, you'll lose the
            #last filled line, so you could make the above statement conditional
            #like so: if lines[-2]: last_received = lines[-2]
            buffer_string = lines[-1]

关于使用readline():这是Pyserial文档必须说的内容(为清晰起见,略作编辑,并提及readlines()):

使用“ readline”时要小心。在打开串行端口时,请务必指定一个超时时间,否则,如果没有收到换行符,它将永远阻塞。另请注意,“
readlines()”仅适用于超时。这取决于是否有超时,并将其解释为EOF(文件末尾)。

这对我来说似乎很合理!



 类似资料:
  • 我试图做一些非常简单的东西,按钮计数器,有一个按钮在我的HTML-php当我点击它我发送数据'按'到我的arduino和它使led闪烁,到目前为止,还不错,但然后我想发送信号,当我在arduino中按下按钮,我想让我的php读取字符串"点击次数: N"的串行端口,N是从arduio的推送计数。 这里的问题是,在arduino串行我可以看到他字符串,一切正常,但在PHP我做

  • 我有一个Azure IOT解决方案,其中来自两台设备的数据将传输到同一IOT中心。从我的计算机上,我只需要从其中一个设备读取消息。我实现了ReadDeviceToCloudMessages。js inhttps://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-node-node-getstarted 但是我在IOThub里收到了所有的信息。如何仅从

  • 我成功地集成了firebase。当我仅出于测试目的使用firebase站点的云消息发送通知时,设备会收到通知。但在我的应用程序中,我需要使用firebase从一台设备向另一台设备发送通知。。如何实现这一点。Swift 4,Xcode 10以下是一些代码:

  • 我拥有一个极地H10胸带,它以蓝牙低能量运行,并提供心率和心率变化。 我想用Android应用程序读取这些值。由于官方BLE教程中的帮助,我能够连接到设备。现在的问题是从设备中读取心率和心率变异性值。每次设备上有新值可用时,我都要读取该值(并且至少每秒都有新值)。 我找到了以下代码: 假设我与设备有连接,我如何使用它来提取心率和r-r间隔(节拍到节拍间隔)?如果有人能举个简短的例子,我会很高兴。此

  • 我读过很多关于用Android通过代码读取APN的话题,自从Android 4.2以来,这似乎已经不可能了。然而,所有的主题都超过了2/3年,我想知道是否有一个好的解决方案,使我能够读取设备的当前APN。我看到过一些关于SQLiteWrapper的东西,但它不起作用,或者我只是没有足够的资格让它起作用。