如何将 python 文件中的数据包发送到我的 uart?
how to send apacket from python file to my uart?
我想通过 Python 文件通过发送一些数据包在笔记本电脑和 UART 之间进行通信:
我的数据包包含=
2 bytes for Star of frames+
2 bytes for command types+
1 byte for the size of my data+
16 bytes for my data+
1 byte for my CRC.
我有一个 file.txt 文件,其中包含我要发送的数据示例:
0xccddeeff0x8899aabb0x445566770x00112233
通过使用我的 python 文件,我想从 file.txt 中读取数据(我已经这样做了),然后我想添加所有其余字段以便发送所有数据包uart.
import string
import serial
import time
from array import array
#Plaintxt.txt File
with open('C:\Users\user\Win_My_Scripts\test.txt') as f:
content = f.readlines()
#serial port
ser = serial.Serial(
port='COM4',\
baudrate=230400,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
#enter inputs plaintext & key
print ('Plaintext=')
SOF= '0x124'
ENCRYPT_PLAINTEXT= '0x7772'
SEND_CYPHERTEXT ='0x7773'
SIZE_OF_FRAME= '0x10'
CRC8= '0x00'
for a in range (0,4):
line_array=content[a]
plaintxt_16b=line_array[0:16]
input_plaintext= SOF+ENCRYPT_PLAINTEXT+SIZE_OF_FRAME+plaintxt_16b+CRC8
print(plaintxt_16b)
ser.write (input_plaintext.encode())
time.sleep(0.4)
#closing the serial port
ser.close()
所以我的问题是:
1/ 如何连接这些变量以获得这样的数据包?
0x1240x77720x100xccddeeff0x8899aabb0x445566770x001122330x00
2/ 然后我的 UART 将从 cmd.exe 读取数据包,你认为这是将数据从 python 发送到 UART 的最佳解决方案吗?如果您有其他建议,我将不胜感激?
提前致谢。
struct.pack就是你想要的。它打包类似于 C 结构的数据。您的示例有两个 16 位值、一个字节长度、四个 32 位值和一个 8 位 CRC。给出如下内容:
SOF = 0x124
CMD = 0x7772
data = [0xccddeeff,0x8899aabb,0x44556677,0x00112233]
CRC8 = 0
这会将其打包为小端(首先发送多字节整数的最低字节)或大端。 hexlify
仅用于显示,因此您可以按照生成的顺序查看字节的十六进制值。
import struct
from binascii import hexlify
packet = struct.pack('<HHBLLLLB',SOF,CMD,4*len(data),data[0],data[1],data[2],data[3],CRC8)
print(hexlify(packet))
packet = struct.pack('>HHBLLLLB',SOF,CMD,4*len(data),data[0],data[1],data[2],data[3],CRC8)
print(hexlify(packet))
输出:
b'2401727710ffeeddccbbaa9988776655443322110000'
b'0124777210ccddeeff8899aabb445566770011223300'
我想通过 Python 文件通过发送一些数据包在笔记本电脑和 UART 之间进行通信: 我的数据包包含=
2 bytes for Star of frames+
2 bytes for command types+
1 byte for the size of my data+
16 bytes for my data+
1 byte for my CRC.
我有一个 file.txt 文件,其中包含我要发送的数据示例:
0xccddeeff0x8899aabb0x445566770x00112233
通过使用我的 python 文件,我想从 file.txt 中读取数据(我已经这样做了),然后我想添加所有其余字段以便发送所有数据包uart.
import string
import serial
import time
from array import array
#Plaintxt.txt File
with open('C:\Users\user\Win_My_Scripts\test.txt') as f:
content = f.readlines()
#serial port
ser = serial.Serial(
port='COM4',\
baudrate=230400,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
timeout=0)
#enter inputs plaintext & key
print ('Plaintext=')
SOF= '0x124'
ENCRYPT_PLAINTEXT= '0x7772'
SEND_CYPHERTEXT ='0x7773'
SIZE_OF_FRAME= '0x10'
CRC8= '0x00'
for a in range (0,4):
line_array=content[a]
plaintxt_16b=line_array[0:16]
input_plaintext= SOF+ENCRYPT_PLAINTEXT+SIZE_OF_FRAME+plaintxt_16b+CRC8
print(plaintxt_16b)
ser.write (input_plaintext.encode())
time.sleep(0.4)
#closing the serial port
ser.close()
所以我的问题是: 1/ 如何连接这些变量以获得这样的数据包?
0x1240x77720x100xccddeeff0x8899aabb0x445566770x001122330x00
2/ 然后我的 UART 将从 cmd.exe 读取数据包,你认为这是将数据从 python 发送到 UART 的最佳解决方案吗?如果您有其他建议,我将不胜感激?
提前致谢。
struct.pack就是你想要的。它打包类似于 C 结构的数据。您的示例有两个 16 位值、一个字节长度、四个 32 位值和一个 8 位 CRC。给出如下内容:
SOF = 0x124
CMD = 0x7772
data = [0xccddeeff,0x8899aabb,0x44556677,0x00112233]
CRC8 = 0
这会将其打包为小端(首先发送多字节整数的最低字节)或大端。 hexlify
仅用于显示,因此您可以按照生成的顺序查看字节的十六进制值。
import struct
from binascii import hexlify
packet = struct.pack('<HHBLLLLB',SOF,CMD,4*len(data),data[0],data[1],data[2],data[3],CRC8)
print(hexlify(packet))
packet = struct.pack('>HHBLLLLB',SOF,CMD,4*len(data),data[0],data[1],data[2],data[3],CRC8)
print(hexlify(packet))
输出:
b'2401727710ffeeddccbbaa9988776655443322110000'
b'0124777210ccddeeff8899aabb445566770011223300'