嘗試使用python中的struct.pack函式打包資料通過串列埠傳送,由stm32接收解析。
1、 struct.pack:
struct.pack用於將python的值根據格式符,轉換為字串(因為python中沒有位元組(byte)型別,可以把這裡的字串理解為位元組流,或位元組陣列)。其函式原型為:struct.pack(fmt, v1, v2, …),引數fmt是格式字串,關於格式字串的相關資訊在下面有所介紹。v1, v2, …表示要轉換的python值。
2、 struct.unpack:
struct.unpack做的工作剛好與struct.pack相反,用於將位元組流轉換成python資料型別。它的函式原型為:struct.unpack(fmt, string),該函式返回乙個元組。
上述fmt中,支援的格式為:
注1.q和q只在機器支援64位操作時有意思;
注2.每個格式前可以有乙個數字,表示個數;
注3.s格式表示一定長度的字串,4s表示長度為4的字串,但是p表示的是pascal字串;
注4.p用來轉換乙個指標,其長度和機器字長相關;
注5.最後乙個可以用來表示指標型別的,佔4個位元組;
為了同c中的結構體交換資料,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第乙個字元來改變對齊方式.定義如下:
python端**如下:
big-endian和little-endian區別:小端:較高的有效位元組存放在較高的的儲存器位址,較低的有效位元組存放在較低的儲存器位址。import serial
import struct
import time
# 串口號 預設為 /dev/ttyusb0
#ser_dev = '/dev/ttyusb1'
ser_dev =
'com1'
# 建立乙個串列埠例項
ser = serial.serial(ser_dev,
115200
, timeout=
1, bytesize=8)
defpack_bin_data
(bottom_degree, top_degree)
:'''
h: unsigned short bit=2
b: unsigned char (byte): bit =1
'''bin_data = struct.pack(
">iibb"
,# 大端儲存
int(a)
,# 資料1
int(b)
,# 資料2
0x0d
,# 幀尾
0x0a
)# 結束符 '\n = 0x0a
return bin_data
ser.write(bin_data )
大端:較高的有效位元組存放在較低的儲存器位址,較低的有效位元組存放在較高的儲存器位址。
例如0x12345678 ,在大端模式的排列:0x01(低位址),0x23,0x45,0x67,0x89(高位址)。
在小端模式的排列:0x89(低位址),0x67,0x45,0x23,0x01(高位址)。
32端解析函式如下:
//串列埠1中斷服務程式
void
usart1_irqhandler
(void
)else
//還沒收到0x0d}}
}#if system_support_os
//如果system_support_os為真,則需要支援os.
osintexit()
;#endif }
void
data_depack
(u8 *data_buf,u8 num)
串列埠傳送資料
s 串列埠程式設計 詳解4 串列埠傳送資料 串列埠傳送資料報括 十六進製制傳送資料 手動傳送資料 自動傳送資料 手動傳送資料的 如下 cpp view plain copy 手動傳送 long tx count 0 void cscommdlg onbuttonmanualsend else els...
Qt tcp打包傳送資料
qstring msg 本句話就是要傳送的資訊內容 qbytearray block 定義乙個位元組陣列 qdatastream out block,qiodevice writeonly block為儲存快取區,只寫模式 out.setversion qdatastream qt 4 6 保持qt...
Python學習筆記 串列埠配置以及傳送資料
import serial import binascii ser serial.serial def port open ser.port 7 設定埠號 ser.baudrate 9600 設定波特率 ser.bytesize 8 設定資料位 ser.stopbits 1 設定停止位 ser.pa...