Fragen zu PySerial und Basisdatentypen
Verfasst: Donnerstag 28. Februar 2008, 17:03
Hallo!
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:
Ich möchte jetzt ein Prgramm in Python schreiben um mit dem Mikrocontroller zu kommunizieren. Dazu 2 Fragen:
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:
Meine Frage ist ganz einfach: Würdet ihr das so machen oder etwa anders? Es ist für mich schon recht interessant da ich bei der Datenübertragung immer 8-bit Zeichen sende und dann ständig mit chr, odr, int usw die typen wandeln muss.
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