RaspberryPi an Arduino -senden und empfangen von Strings

Dies ist der code den ich momentan verwende zum senden und empfangen von int-Werte aus einem RaspberryPi an einen Arduino per i2C. Es funktioniert gut für Werte von 0-255, aber wegen der 1-byte-Grenze, etwas größer ausfällt.

Um diese zu umgehen, möchte ich zum senden und empfangen von string-Werten statt, und dann wieder zurück konvertieren in int, wenn nötig.

Welche änderungen würde ich vornehmen muss in den folgenden?

Hier ist mein RPi Python-code

import smbus
import time
# for RPI version 1, use "bus = smbus.SMBus(0)"
bus = smbus.SMBus(1)

# This is the address we setup in the Arduino Program
address = 0x04

def writeNumber(value):
    bus.write_byte(address, value)
    # bus.write_byte_data(address, 0, value)
    return -1

def readNumber():
    number = bus.read_byte(address)
    # number = bus.read_byte_data(address, 1)
    return number

while True:
    try:
        var = int(raw_input("Enter 1 - 9: "))
    except ValueError:
        print "Could you at least give me an actual number?"
        continue

    writeNumber(var)
    print "RPI: Hi Arduino, I sent you ", var
    # sleep one second
    #time.sleep(1)

    number = readNumber()
    print "Arduino: Hey RPI, I received a digit ", number
    print

Und hier ist mein Arduino-code

#include <Wire.h>

#define SLAVE_ADDRESS 0x04
int number = 0;
int state = 0;

void setup() {
    pinMode(13, OUTPUT);
    Serial.begin(9600);         // start serial for output
    // initialize i2c as slave
    Wire.begin(SLAVE_ADDRESS);

    // define callbacks for i2c communication
    Wire.onReceive(receiveData);
    Wire.onRequest(sendData);

    Serial.println("Ready!");
}

void loop() {
    delay(100);
}

// callback for received data
void receiveData(int byteCount){

    while(Wire.available()) {
        number = Wire.read();
        if (Wire.available() > 1)  // at least 2 bytes
        {
          number = Wire.read() * 256 + Wire.read();
        }
        Serial.print("data received: ");
        Serial.println(number);
        //sendData();
        if (number == 1){

            if (state == 0){
                digitalWrite(13, HIGH); // set the LED on
                state = 1;
            }
            else{
                digitalWrite(13, LOW); // set the LED off
                state = 0;
            }
         }
     }
}

// callback for sending data
void sendData(){
    Wire.write(number);
}
  • Sorry für die (vielleicht) unabhängige Frage, aber warum nicht direkt über die serielle statt? Sind Sie gezwungen, zu verwenden i2c?
InformationsquelleAutor Bachalo | 2014-07-17
Schreibe einen Kommentar