Mam więc coś w rodzaju ignorancji (być może?). Pracuję z pisaniem na urządzenie szeregowe po raz pierwszy. Mam ramkę [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, X, Y], którą muszę wysłać. X i Y są wartościami sum kontrolnych. Moje rozumienie w użyciu modułu pyserial jest to, że muszę przekonwertować tę ramkę na reprezentację ciąg. Ok to w porządku, ale jestem zdezorientowany na jaki format rzeczy mają być w. Próbowałem robićDziesiętny na szesnastkowy w pytonie
a = [12, 0, 0, 0, 0, 0, 0, 0, 7, 0, X, Y]
send = "".join(chr(t) for t in a)
Ale mój zamieszanie wynika z faktu, że X i Y, przy użyciu Chr, przekształcać w dziwnych ciągów (zakładając ich ascii reprezentację). Na przykład, jeśli X wynosi 36, chr (x) to "$" zamiast "\ x24". Czy istnieje sposób, aby uzyskać ciąg reprezentujący wartość "\ xnn" zamiast kodu ASCII? Najbardziej mylące jest to, że 12 i 7 poprawnie konwertują na "\ x0b" i "\ x07". Czy czegoś brakuje?
Aktualizacja:
Więc może się okazać, że nie jestem dość zrozumienia, jak pisze seryjne są robione albo co moje urządzenie oczekuje mnie. To jest część mojego kodu C, które działa:
fd=open("/dev/ttyS2",O_RDWR|O_NDELAY);
char buff_out[20]
//Next line is psuedo
for i in buff_out print("%x ",buff_out[i]); // prints b 0 0 0 0 0 0 0 9 b3 36
write(fd,buff_out,11);
sleep()
read(fd,buff_in,size);
for i in buff_in print("%x ",buff_in[i]); // prints the correct frame that I'm expecting
Python:
frame = [11, 0, 0, 0, 0, 0, 0, 0, 9] + [crc1, crc1]
senddata = "".join(chr(x) for x in frame)
IEC = serial.Serial(port='/dev/ttyS2', baudrate=1200, timeout=0)
IEC.send(senddata)
IEC.read(18) # number of bytes to read doesn't matter, it's always 0
Czy będę o tym właściwą drogę? Oczywiście nie można dokładnie określić, ponieważ jest to specyficzne dla urządzenia i nie mogę podać zbyt wielu szczegółów. Ale czy jest to właściwy format, w którym serial.send() oczekuje danych?
Z dokumentacji Pythona, chr() zwraca liczbę ty wprowadź jako znak ascii. 12 i 7 w ascii to dzwonek i forma "znaków" paszy, których python może nie być w stanie wydrukować (nie wiem na pewno). Więc może to być domyślne dla reprezentacji hex dla tych, ponieważ są one niewykrywalne. – Joel
12 powinno być \ x0c, nie \ x0b ... – EOL
Niestety chodziło mi o \ x0c. Mam kolejną klatkę, która zaczyna się od 11 – Falmarri