python串行优化

python串行优化,python,pyserial,Python,Pyserial,我正在从串行端口读取一些数据。数据打包为9个字符。不需要struct,我知道格式是什么,但有两个问题: 1) 如果我保持端口打开,答案是事件发生后1-3秒(有一个led面板,我可以在其中看到实时事件和应为串行的值)。我认为它与一些缓冲区有关,只有当缓冲区满时才会刷新(我被迫以非管理员的身份在Win32上工作,所以不能很好地控制它)。读取是周期性的(200毫秒),因此打开/关闭看起来像是浪费资源。有没有办法保持端口打开,并在读取之前强制缓冲区刷新?(来自python!) 2) 为了得到这些值,我必

我正在从串行端口读取一些数据。数据打包为9个字符。不需要struct,我知道格式是什么,但有两个问题: 1) 如果我保持端口打开,答案是事件发生后1-3秒(有一个led面板,我可以在其中看到实时事件和应为串行的值)。我认为它与一些缓冲区有关,只有当缓冲区满时才会刷新(我被迫以非管理员的身份在Win32上工作,所以不能很好地控制它)。读取是周期性的(200毫秒),因此打开/关闭看起来像是浪费资源。有没有办法保持端口打开,并在读取之前强制缓冲区刷新?(来自python!)

2) 为了得到这些值,我必须找到一个标记-13-作为struct的结尾,并按顺序读取(下一个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和stuff用于通知主GUI

我使用检查我的_serial.inWaiting()来确定是否有任何字节等待读取,然后在单独的线程中读取所有字节,这将引发一个事件并附加接收到的数据


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

可能是1)的解决方案。这样,即使在200毫秒读取之间,我也可以跟踪更改。我会在几个小时后再试(现在我离设备不远了)。谢谢。你的回答迫使我做了一些测试。缓冲区是4096,因此打开/关闭连接和读取值的速度更快(我一次只需要9个字节)。请记住,我只需要读取时的值,而不需要所有数据(设备“吐出”它的值取决于是否被询问)。我正试图将其转移到cython,函数调用比python中的要轻得多,但缺点是我从GUI进行了函数调用,因此没有cython优化。你的回答也迫使我使用IDE。如果我从一开始就这么做,inWaiting()函数对我来说很常见。。。