C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
maDa
Inlägg: 4079 Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:
Inlägg
av maDa » 18 mars 2015, 08:27:18
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)
baron3d
EF Sponsor
Inlägg: 1352 Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp
Inlägg
av baron3d » 18 mars 2015, 08:40:13
Ä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.
maDa
Inlägg: 4079 Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:
Inlägg
av maDa » 18 mars 2015, 10:25:50
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å.
Nerre
Inlägg: 27148 Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby
Inlägg
av Nerre » 18 mars 2015, 11:08:31
Du kanske missade det lilla tipset:
baron3d skrev:
Deklarera dina byte som unsigned char.
En "char" över 127 räknas som ett negativt tal.
maDa
Inlägg: 4079 Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:
Inlägg
av maDa » 18 mars 2015, 15:18:24
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)
Nerre
Inlägg: 27148 Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby
Inlägg
av Nerre » 18 mars 2015, 21:31:33
I mina ögon är det char c_byte; som är problemet. Hjälpte det inte att ändra den till unsigned char c_byte; ?