0

我从串口读取了一些数据。数据打包为 9 个字符。不需要结构,我知道格式是什么,但有两个问题:1)如果我保持端口打开,答案是事件发生后 1-3 秒(有一个 LED 面板,我可以实时看到应该连续出现的事件和值)。我认为它与某些仅在满时才刷新的缓冲区有关(并且我被迫以非管理员身份在 Win32 上工作,因此对此没有太多控制)。读取是定期执行的(200 毫秒),因此打开/关闭似乎是一种资源浪费。有没有办法保持端口打开并在读取之前强制缓冲区刷新?(来自python!)

2)为了获取值,我必须找到一个标记 - 13 - 作为结构的结尾,并相应地读取(下一个 8 字符或前 8 个字符)。循环不是最有效的python部分,那么它是一种获取索引和读取数据而不阻塞一切的方法吗?(连续读取保持处理器运行,即使在其他线程中作为非阻塞解决方案)。如果有任何用途:

class SeReader(object):
    def __init__(self, tata):
        self.ser = serial.Serial()
        self.ser.baudrate = 2400
        self.ser.port = "COM1"
        self.tata = tata # entry point for main gui notification
        self.val, self.status, self.semn, self.data, self.oldVal = None, None, None, None, None
        self.is_stable, self.on = False, False
        self.stable_count = 0
        self.on = False

    def read(self):
        if not self.on: return False
        self.ser.open()
        data = self.ser.read(18)
        self.ser.close()
        start = -1
        for x in xrange(18):
            if data[x] == '\r':
                start = x + 1
                break
        if start == -1:return True
        self.data = val = data[start:start + 9]
        try:
            self.status = val[0]
            self.val = val[2:8]
            self.semn = val[1]
            self.tata.write_data(self.semn, self.val)
        except Exception as e:
            self.tata.set_cs_unstable()
            self.tata.write_data("> ", "Eroare")
            print(self.val, e)
        if self.val == self.oldVal:
            self.stable_count += 1
        else:
            self.oldVal = self.val
            self.stable_count = 0
        if self.stable_count > 8:self.tata.set_cs_stable()
        else:self.tata.set_cs_unstable()
        return True

self.tata 和其他东西用于通知主 GUI

4

1 回答 1

0

我使用检查 my_serial.inWaiting() 来确定是否有任何字节等待读取,然后在一个单独的线程中将它们全部读取,然后引发一个附带接收到的数据的事件。

一旦我有一个数据块,我可以使用正则表达式(re)搜索给定的开始/结束序列,如果这些块与其他数据混合在一起。

于 2013-09-11T11:03:00.713 回答