RaspberryPi, Arduino -senden und empfangen von Strings
Dies ist der code den ich momentan verwende zum senden und empfangen von int-Werte aus einem RaspberryPi, einem 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 müsste ich machen?
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Überprüfen Sie den folgenden Link:
[http://www.i2c-bus.org/%5D%5B1%5D
Wenn ich Daten senden und zurück-mit I2C-ich war die Umwandlung der string-Zeichen, um bytearrays und Umgekehrt. So, da sind Sie immer bytes senden. Es wird immer Arbeit da, die Sie senden, zahlen zwischen 0-255.
Nicht, ob das hilft, aber zumindest kann Ihnen eine Idee geben.
Wenn Sie mit 'unicode', was es ist 2 bytes oder mehr. Sie sind zu haben, um eine Verschiebung der Werte von entweder das erste element oder das zweite element. Oder Sie und erhalten Sie die 16-bit-äquivalent. Ich will hinzufügen, zu der Frage ein kurzes Beispiel.
Eigentlich. Ich habe eine schnelle Suche, und Sie sollten in der Lage sein, verwenden Sie das folgende python-Modul, um einige der Konvertierungen: Konvertieren zwischen Binär-und ASCII
InformationsquelleAutor rch
Dieses problem hat im wesentlichen zwei teilen: teilen eine ganze Zahl in Ihre bytes und zusammensetzen eine ganze Zahl von bytes. Diese Teile repliziert werden müssen, sowohl auf der Pi und Arduino. Ich werde die Adresse der Pi-Seite zuerst, in Python:
Aufteilung einer integer:
Zusammenbau eine ganze Zahl von bytes:
Arduino-Seite, in C
Teilen einer Integer:
Wiederzusammenbau erhielt Integer:
Hinweis: ich habe einige Schwierigkeiten zu verstehen, was Ihre anderen code in diese routine zu tun, so bin ich dabei es zu reduzieren, um nur die Montage der integer.
Habe ich nicht die Materialien zur hand um dies zu testen, es ist also möglich, ich habe die byte-Reihenfolge umgedreht in eine routine oder ein anderes. Wenn Sie finden, Sachen in oder out kommen nach hinten, der einfachste Ort um es zu beheben ist in der Python-Skript mit der eingebauten Funktion Umgekehrt() auf die strings oder Listen.
Verweise (ich habe einige code aus der Arduino Beispiele):
Arduino String Objekte
Arduino-String-Konstruktoren
Python Built-ins chr() und ord()
InformationsquelleAutor skrrgwasme
Könnte man wandelt die Zahl in einen string von Ziffern, wie Sie sagte. Aber man könnte auch senden Sie die raw-bytes.
String von Ziffern
Vorteile
Nachteile
(digits + 1)
Größe.Raw bytes
Vorteile
struct
Bibliothek, die packt/entpackt jedes byte in eine Zahl zu einem string zu senden/empfangen, so brauchen Sie nicht zu tun, die Arithmetik wie in C++.Nachteile
-2147483648
zu2147483647
). Aber es spielt keine Rolle, weil kein Arduino verarbeiten kann, mehr als 32-bit sowieso.So würde ich die raw-bytes-Methode, die ich einige ungetestete Funktionen hier:
Und das Arduino-Teil:
Ich habe keine Erfahrung mit I2C, aber wenn die Warteschlange ist eine FIFO -, dann sollte der code funktionieren.
InformationsquelleAutor Flávio Toribio