我正在从串行端口读取一些数据。数据打包为9个字符。不需要struct,我知道格式是什么,但是有两个问题: 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
在赛尔夫塔塔这些东西是用来通知主图形用户界面的
我用我的支票_串行等待()找出是否有字节等待读取,然后在单独的线程中读取所有字节,然后在附加接收数据的情况下引发事件。在
一旦我有了一个数据块,我就可以使用正则表达式(re)搜索给定的开始/结束序列,如果这些数据块与其他数据混合在一起的话。在
相关问题 更多 >
编程相关推荐