2016-11-23 6 views
0

Ich möchte durch das Senden einige Paketkommunikation zwischen Laptop und UART über Python-Datei erstellen: Mein Paket enthält =wie apacket von Python-Datei an meine Uart senden?

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. 

Ich habe eine datei.txt Datei, die ein Beispiel von Daten enthält, die ich senden möchten:

0xccddeeff0x8899aabb0x445566770x00112233 

Durch meine python-Datei ich möchte Daten von datei.txt lesen (was ich bereits getan haben), dann will ich in den ganzen Rest des Feldes hinzufügen, um alle das Paket für die uart zu senden.

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() 

Also meine Fragen sind: 1/Wie diese Variablen, um verketten solches Paket zu haben?

 0x1240x77720x100xccddeeff0x8899aabb0x445566770x001122330x00 

2/My UART dann wird dieses Paket von cmd.exe lesen, tun thik Sie, dass die beste Lösung ist, Daten von Python senden an UART? Ich wäre Ihnen sehr dankbar, wenn Sie einen anderen Vorschlag hätten?

Vielen Dank im Voraus.

+0

See struct.pack. –

+0

IS Struct Pack nur für die Verkettung verwendet, das ist es? – tssmokey46

Antwort

0

struct.pack ist was du willst. Es packt Daten ähnlich einer C-Struktur. Ihr Beispiel enthält zwei 16-Bit-Werte, eine Byte-Länge, vier 32-Bit-Werte und einen 8-Bit-CRC. Gegeben in etwa wie folgt:

SOF = 0x124 
CMD = 0x7772 
data = [0xccddeeff,0x8899aabb,0x44556677,0x00112233] 
CRC8 = 0 

Dies wird es packen Little-Endian (senden Sie das niedrigste Byte der Multi-Byte-Zahlen zuerst) oder Big-Endian. hexlify ist nur zur Anzeige, so dass Sie die hexadezimalen Werte der Bytes in der Reihenfolge sehen können, die generiert wird.

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)) 

Ausgang:

b'2401727710ffeeddccbbaa9988776655443322110000' 
b'0124777210ccddeeff8899aabb445566770011223300'