Sida 1 av 1
Arduino/Python/Lua seriellt mysterium
Postat: 18 mars 2015, 08:27:18
av maDa
Har råkat ut för ett litet seriellt mysterium
Jag håller på att ta fram ett mycket enkelt och lätt protokoll för utbyta data mellan en enkorts-Linux och en Ardunio. Jag har lite olika definierade bytes för start/stop/metod osv. Det mystiska är att över en visst värde så hoppar det från en 1 byte till 8 byte
När jag ändrar från 0x6A till 0x8A så händer följande
Kod: Markera allt
% invalid packet header (0x0)
% invalid packet header (0x0)
% invalid packet header (0x0)
% invalid packet header (0x6A)
% invalid packet header (0x1)
% invalid packet header (0x6F)
Kod: Markera allt
% invalid packet header (0x0)
% invalid packet header (0x0)
% invalid packet header (0x0)
% invalid packet header (0xFFFFFF8A)
% invalid packet header (0x1)
% invalid packet header (0xFFFFFF8F)
Re: Arduino/Python/Lua seriellt mysterium
Postat: 18 mars 2015, 08:40:13
av baron3d
Är det inte bara visningen som visar en signed int 32bitar.
När din byte överskrider 0x7F slår den över och visar ett minustal.
0x7E -> 0x7E
0x7F -> 0x7F
0x80 -> 0xFFFFFFFF80
0x81 -> 0xFFFFFFFF81
Deklarera dina byte som unsigned char.
Re: Arduino/Python/Lua seriellt mysterium
Postat: 18 mars 2015, 10:25:50
av maDa
Hmm, det är faktiskt möjligt. Men jag får ändå inte den att matcha byte'n. Jag är dock ingen mästare på C.
Så här ser lite av koden ut:
Kod: Markera allt
#define CL_START 0xE0
#define CL_END 0xEF
#define CB_SRECV_STAT 0xB3
int ib = 0;
char c_byte;
char c_method;
char buffer[32];
if(Serial.available()) {
c_byte = Serial.read();
if(c_byte == CL_START) { // start of packet
ib = 0;
c_method = Serial.read(); // method or call
while(Serial.available()) {
c_byte = Serial.read();
if(c_byte != CL_END && ib < 32) { // wait for CL_END, or max 32 bytes
buffer[ib] = c_byte;
ib++;
}
}
#ifdef DEBUG_INLINE
if(debug) {
Serial.print("% method (0x");
Serial.print(c_method, HEX);
Serial.println(")");
Serial.print("% buffer (");
Serial.print(buffer);
Serial.println(")");
}
#endif
} else {
#ifdef DEBUG_INLINE
if(debug) {
Serial.print("% invalid packet header (0x");
Serial.print(c_byte, HEX);
Serial.println(")");
}
#endif
return false;
}
} else {
// no data
return false;
}
Python-koden
Kod: Markera allt
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 19200, timeout=2)
time.sleep(3);
ser.write(chr(0x00))
ser.write(chr(0x00))
ser.write(chr(0x00))
ser.write(chr(0xe0))
ser.write(chr(0x01))
ser.write(chr(0xef))
#ser.write('\n')
for line in ser.readlines():
print line.strip()
Jag kanske skippa ha dem som
#define och istället som
const PROGMEM uint8_t eller så.
Re: Arduino/Python/Lua seriellt mysterium
Postat: 18 mars 2015, 11:08:31
av Nerre
Du kanske missade det lilla tipset:
baron3d skrev:
Deklarera dina byte som unsigned char.
En "char" över 127 räknas som ett negativt tal.
Re: Arduino/Python/Lua seriellt mysterium
Postat: 18 mars 2015, 15:18:24
av maDa
Jag har gjort om #define's till
unsigned char PROGMEM nu.
Kod: Markera allt
const unsigned char CB_SRECV_STAT PROGMEM = 0xb3;
Nu fungerar det! Tack
Kod: Markera allt
% invalid packet header (0x0)
% invalid packet header (0x0)
% invalid packet header (0x0)
% method (0xB3)
% buffer 'hejhej'
% srecv beacon (mode:0x1 info:hejhej)
Re: Arduino/Python/Lua seriellt mysterium
Postat: 18 mars 2015, 21:31:33
av Nerre
I mina ögon är det char c_byte; som är problemet. Hjälpte det inte att ändra den till unsigned char c_byte;?