python在字節流中對int24的轉換


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM