python在字節流中對int24的轉換
概述
最近在寫項目的過程中,需要對從串口中讀取的數據進行處理,本來用C寫完了,但是卻一直拿不到正確的數據包,可能是因為自己太菜了。后來用了python重新寫了一次,不得不說python的serial庫真的好用,所有對於串口的操作都在庫中實現了,只要簡單的調用就可以。
由於項目中需要把讀取的數據幀進行處理,拿到關於位置坐標的實際值,但是在處理過程中,由於python中int的數據類型長度不定,所以處理字節時總是會導致沒有判斷正負號而導致數據不正確。下面給出了將3個字節表示的數正確顯式的代碼
代碼
# 傳入9個字節大小的字節數組
def getPosition(data):
temp = [0,0,0]
for i in range(0,9,3):
# 判斷是否為負數
if (data[i+2] & 0x80) == 128:
p1 = - ((((data[i]) ^ 0xff) | ((data[i+1]) ^ 0xff) << 8 | (data[i+2] ^ 0xff) << 16) +1 )
else:
p1 = ((data[i]) << 8 | (data[i+1]) << 16 | (data[i+2]) << 32) / (256)
temp[i//3] = p1;
# print(temp)
return temp
判斷校驗和
傳入一個字符數組,長度為128bytes,通過將前127個字節相加,判斷是否與第128個字節相等,相等則接收正確,否則數據幀接收錯誤。
def check(strr):
summ = 0
for i in range(127):
summ += int(strr[i])
summ %= 256
return summ == int(strr[127])
對於字節流中4個字節的float進行轉換
需要用到struct庫,主要是其中的pack和unpack方法,代碼如下
import struct
def get_gyro(gyro):
temp = [0, 0, 0]
x = gyro[0: 4]
y = gyro[4: 8]
z = gyro[8: 12]
temp[0] = struct.unpack('<f', struct.pack('4B', *x))[0]
temp[1] = struct.unpack('<f', struct.pack('4B', *y))[0]
temp[2] = struct.unpack('<f', struct.pack('4B', *z))[0]
# print(temp)
return temp
