#define u32 unsigned int
#define s32 int
#define u16 unsigned short
#define s16 short
#define u8 unsigned char
#define s8 char
取 u8#define BYTE0(dwTemp) (*((char *)(&dwTemp)))
#define BYTE1(dwTemp) (*((char *)(&dwTemp) + 1))
#define BYTE2(dwTemp) (*((char *)(&dwTemp) + 2))
#define BYTE3(dwTemp) (*((char *)(&dwTemp) + 3))
例子:
u32 temp_data_32;
u8 buffer[4];
buffer[0] = BYTE0[temp_data_32];
buffer[1] = BYTE1[temp_data_32];
buffer[2] = BYTE2[temp_data_32];
buffer[3] = BYTE3[temp_data_32];
從 u8 數(shù)組取數(shù)據(jù)u8 data[num]; // 假設(shè)你所需的數(shù)據(jù)大量存在data數(shù)組中
// 取 8bit
u8 data_u8[num];
data_u8[0] = *(data);
data_u8[1] = *(data + 1);
...
// 取 16bit
u16 data_u16[num];
data_u16[0] = *((u16 *)(data));
data_u16[1] = *((u16 *)(data + 2));
data_u16[2] = *((u16 *)(data + 4));
...
s16 data_s16[num];
data_s16[0] = (*((s16 *)(data))) / 1.0f;
data_s16[1] = (*((s16 *)(data + 2))) / 1.0f;
data_s16[2] = (*((s16 *)(data + 4))) / 1.0f;
...
// 取 32bit
s32 data_s32[num];
data_s32[0] = *((s32 *)(data));
data_s32[1] = *((s32 *)(data + 4));
data_s32[2] = *((s32 *)(data + 8));
使用聯(lián)合體 union使用聯(lián)合體將float型數(shù)據(jù)拆分成字節(jié)數(shù)組
首先定義一個(gè)聯(lián)合體
typedef union{float data;
uint8_t data8[4];
}data_u;
這個(gè)聯(lián)合體中有兩個(gè)成員,一個(gè)是32位的float數(shù)據(jù)data,另一個(gè)同樣是占據(jù)了32位字長(zhǎng)的字節(jié)數(shù)組data8,根據(jù)聯(lián)合體的性質(zhì),這兩個(gè)成員所在的內(nèi)存位置是一樣的,也就是說(shuō),改變其中任何一個(gè)成員的值,另一個(gè)也會(huì)被改變.利用這個(gè)性質(zhì),我們就可以實(shí)現(xiàn)float與字節(jié)數(shù)據(jù)的互換。
data_u _temp; // 聲明一個(gè)聯(lián)合體實(shí)例,使用它將待發(fā)送數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組
uint8_t data_to_send[100]; // 待發(fā)送的字節(jié)數(shù)組
data_to_send[_cnt++]=0xAA;
data_to_send[_cnt++]=0xBB;
// 將要發(fā)送的數(shù)據(jù)賦值給聯(lián)合體的float成員
// 相應(yīng)的就能更改字節(jié)數(shù)組成員的值
_temp.data = imu_data.yaw;
data_to_send[_cnt++]=_temp.data8[0];
data_to_send[_cnt++]=_temp.data8[1];
data_to_send[_cnt++]=_temp.data8[2];
data_to_send[_cnt++]=_temp.data8[3]; // 最高位
_temp.data = imu_data.pit;
data_to_send[_cnt++]=_temp.data8[0];
data_to_send[_cnt++]=_temp.data8[1];
data_to_send[_cnt++]=_temp.data8[2];
data_to_send[_cnt++]=_temp.data8[3]; // 最高位
_temp.data = imu_data.rol;
data_to_send[_cnt++]=_temp.data8[0];
data_to_send[_cnt++]=_temp.data8[1];
data_to_send[_cnt++]=_temp.data8[2];
data_to_send[_cnt++]=_temp.data8[3]; // 最高位
接收端同理,只要將接收到的數(shù)據(jù)逐個(gè)存入聯(lián)合體的 data8[] 數(shù)組中就好,然后調(diào)用data進(jìn)行使用。
Python dict 功能幀可以巧妙使用 Python 中的 dict 數(shù)據(jù)類型,以此來(lái)記入功能幀。
param_dic = {'speed': 0x01, 'voltage': 0x02, 'read': 0x03}
struct 包python struct
參考上面的官方文檔,使用就好了
列舉一些注意點(diǎn):
sys.byteorder
來(lái)檢查你的系統(tǒng)字節(jié)順序h
格式,將自動(dòng)進(jìn)行如下操作。在C語(yǔ)言端的處理要注意import struct
data = struct.pack('BBBBBBBB', 0xEA, 0xFF, 0x1E, 0x00, 0x64, 0x60, 0xEA, 0xFF) # 打包
print(data)
data = struct.unpack('
b'\xea\xff\x1e\x00d`\xea\xff'
-22
30
65514
data[0] = eaff = ffea = 65514-65536 = - 22
data[1] = 1e00 = 001e = 30
data[4] = eaff = ffea = 65514
因?yàn)橛蟹?hào)類型,最高位表示正負(fù)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
本文標(biāo)題:C和Python的串口通信協(xié)議小技巧-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://aaarwkj.com/article42/jcdhc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣、網(wǎng)站收錄、動(dòng)態(tài)網(wǎng)站、App開(kāi)發(fā)、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容