Arduino/Python/Lua seriellt mysterium

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
maDa
Inlägg: 4079
Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:

Arduino/Python/Lua seriellt mysterium

Inlägg 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)
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1352
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Arduino/Python/Lua seriellt mysterium

Inlägg 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.
Användarvisningsbild
maDa
Inlägg: 4079
Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:

Re: Arduino/Python/Lua seriellt mysterium

Inlägg 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å.
Nerre
Inlägg: 27148
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduino/Python/Lua seriellt mysterium

Inlägg 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.
Användarvisningsbild
maDa
Inlägg: 4079
Blev medlem: 11 november 2005, 22:13:16
Ort: Malmö
Kontakt:

Re: Arduino/Python/Lua seriellt mysterium

Inlägg 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)
Nerre
Inlägg: 27148
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Arduino/Python/Lua seriellt mysterium

Inlägg 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;?
Skriv svar