Ich habe ein Programm für einen AVR 8-bit Mikrocontroller geschrieben welches unter anderem Daten über sie serielle Schnittstelle überträgt. Zur fehlerfreien Übertragung wird auch ein CRC Wert der Daten gesendet der mit folgender C-Funktion berechnet wird:
Code: Alles auswählen
uint16_t crc_xmodem_update(uint16_t crc, uint8_t data) {
int i;
crc = crc ^ ((uint16_t)data << 8);
for (i=0; i<8; i++) {
if(crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
return crc;
}
1. Gibt es mit PySerial eine Möglichkeit eine Liste der zur Verfügung stehenden seriellen Schnittstellen zu bekommen?
2. Ich habe die CRC Funktion folgendermaßen in Python umgesetzt finde die Lösung aber ineffizient, da ich "unnötige" Formatierungen vornehmen muss da Python keinen reinen 8-bit char oder 16-bit int datentyp besitzt mit dem man logisches rechts/links-schieben betreiben kann:
Code: Alles auswählen
def crc_xmodem_update(crc, data):
crc = crc ^ (data << 8)
for i in range(8):
if(crc & 0x8000):
crc = (crc << 1) ^ 0x1021
else:
crc = crc << 1
crc -= (crc >> 16)*(1 << 16)
return crc
def get_crc(data):
crc = 0xFFFF
for c in data:
crc = crc_xmodem_update(crc, ord(c))
return crc