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;?