Python3串口操作及字节与无符号整数之间的转换 September 5, 2018 学校的某项目,嵌入式用C语言完成,移位操作,各种拼接,不同位数的整数相互装换,都很方便。为了测试功能,用Python写了个简单的上位机,整理下在Python中如何操作串口与字节。 ------------ 做区块链浏览器解析script时发现,对于一个字节数组data: `type(data[0])`为`int`,而`type(data[0:1])`为`bytes`。 ------------ ```python import serial def hex2b(hex): return bytes.fromhex(hex) def b2hex(bytes): return bytes.hex() def b2uint(bytes): return int.from_bytes(bytes, byteorder='big', signed=False) def uint2b(num): return num.to_bytes(2, byteorder='big', signed=False) def check_sum(data): sum = 0 for i in data: sum = sum + i sum = bytes([uint2b(sum)[1]]) return sum def get_file_info(file_id): header = b'\xEB\x10' data = b'\x00\x01'+ uint2b(file_id)+b'\x00'*8 sum = check_sum(data) return header + data + sum + b'\x90' def parser_file_info(data): frame_sum = bytes([data[7],data[8]]) file_size = bytes([data[9],data[10]]) return b2uint(frame_sum), b2uint(file_size) def get_file_frame(file_id, frame_id, file_size): header = b'\xEB\x81' data = b'\x00\x01' + uint2b(file_id) + uint2b(frame_id) + uint2b(file_size) + bytes([0])*4 sum = check_sum(data) return header + data + sum + b'\x90' def parser_file_frame(data): return data[8:254] buff = bytes() ser = serial.Serial("com4", 115200, timeout=0.5) if ser: print('open com4') # 获取第一张图像 file_id = 1 ser.write(get_file_info(file_id)) r = ser.read(16) frame_sum, file_size = parser_file_info(r) for i in range(frame_sum): ser.write(get_file_frame(file_id, i+1, file_size)) r = ser.read(256) if len(r)==256: r = parser_file_frame(r) print('get frame %d success'%(i+1)) buff = buff + r else: print('get frame %d failure'%(i+1)) with open('test.jpg', 'wb') as f: f.write(buff) ser.close() ```