我在Python 3中编写代码以从ECG传感器读取数据。最终代码必须将从传感器接收的数据包写入文件。 这是我实际拥有的代码:
import serial
if __name__ == '__main__':
buffer = [0, 0, 0, 0, 0, 0]
f = open('dumpECG', 'w')
print("Hi")
ser = serial.Serial('/dev/ttyUSB0', 115200)
while 1 == 1:
while ser.inWaiting() > 6:
buf = ser.read()
if buf > b'\xf7':
if buf == b'\xfd':
1 == 1
else:
buffer[0] = buf
if ser.isOpen():
buffer[1] = ser.read()
if buffer[0] == b'\xf8':
temp = (ord(buffer[1]) >> 4) + 2
if temp < 11:
for i in range(2, int(temp), 1):
if ser.isOpen():
buffer[i] = ser.read()
print(buffer)
data = ''.join(str(e) for e in buffer)
data = map(hex, map(ord, data))
f.write(''.join(data))
f.write("\n")
elif buffer[0] == b'\xfe':
temp = (ord(buffer[1]) >> 4) + 2
if temp < 8:
for i in range(2, int(temp), 1):
if ser.isOpen():
buffer[i] = ser.read()
print(buffer)
f.write(''.join(str(e) for e in buffer))
f.write("\n")
elif buffer[0] == b'\xf9' or buffer[0] == b'\xfa':
if ser.isOpen():
buffer[2] = ser.read()
print(buffer)
f.write(''.join(str(e) for e in buffer))
f.write("\n")
elif buffer[0] == b'\xfc':
for i in range(2, int(6), 1):
if ser.isOpen():
buffer[i] = ser.read()
f.write(''.join(str(e) for e in buffer))
f.write("\n")
作为示例数据,当到达第一个打印(缓冲区)缓冲区时包含:&#34; [b&#39; \ xf8&#39;,b&#39; 8&#39;,b&#39; \ x80&#39 ;,&#39; \ x80&#39;,b&#39; \ x80&#39;,0]&#34;我必须写入文件&#34; 0xF8,0x38,0x80,0x80,0x80,0和#34; 我试过这样做
data = ''.join(str(e) for e in buffer)
data = map(hex, map(ord, data))
但他会转换所有字符,而不是值。
答案 0 :(得分:1)
所以你有这个:
"[b'\xf8', b'8', b'\x80', b'\x80', b'\x80', 0]"
你想要这个:
"0xF8, 0x38, 0x80, 0x80, 0x80, 0"
(我假设你真的想要0x38
,而不是0x08
,因为b'8'
是b'\x38'
,而不是b'\x08'
。如果我是错了,你需要解释你的规则...)
首先要注意的是,这显然是由Python的repr
生成的输出,因为没有其他任何常见的东西可以给你那些b
- 前缀字符串。如果可能的话,更改生成这些字符串的任何代码可能会好得多,以便它只传递列表(如果在Python中)或使用一些标准化,安全,健壮的交换格式,如JSON,而不是只打印出{{ 1}}。但是如果你不能改变它,那么扭转它的方法是repr
:
ast.literal_eval
接下来,其中一些值是单字节>>> ast.literal_eval(buffer)
[b'\xf8', b'8', b'\x80', b'\x80', b'\x80', 0]
对象,有些是数字。看起来您想要单独留下数字,但将字节转换为十六进制数字。因此,我们需要为每种类型做不同的事情。
我们为每种类型做些什么?好吧,对于bytes
,我们必须调用bytes
(或仅使用ord
),然后调用[0]
,就像您尝试的那样。但是对于hex
,我们只需要致电int
。所以:
str
现在我们加入他们:
>>> [hex(ord(b)) if isinstance(b, bytes) else str(b)
... for b in ast.literal_eval(buffer)]
['0XF8', '0X38', '0X80', '0X80', '0X80', '0']
如果你真的需要字母十六进制数字大写,>>> ', '.join(hex(ord(b)) if isinstance(b, bytes) else str(b)
... for b in ast.literal_eval(buffer))
'0xf8, 0x38, 0x80, 0x80, 0x80, 0'
不能这样做,所以:
hex