RS-232-Kommunikation mit einem Arduino Duemilanove und dem Cutedigi RS-232-Schnittstelle
Ich habe einige Mühe, meinen Arduino microcontroller zu Lesen RS-232 Signale. Mein Projekt verlangt von mir das Lesen von Daten wird ausgegeben Luftqualität überwachen.
Meine Komponenten:
Um zu testen, ob die serielle Kommunikation richtig funktioniert, fand ich einige Beispiel-code auf der Arduino website. Dies ist der genaue code, den ich verwende:
//Created August 23 2006
//Heather Dewey-Hagborg
//http://www.arduino.cc
#include <ctype.h>
#define bit9600Delay 84
#define halfBit9600Delay 42
#define bit4800Delay 188
#define halfBit4800Delay 94
byte rx = 0;
byte tx = 1;
byte SWval;
void setup() {
pinMode(rx,INPUT);
pinMode(tx,OUTPUT);
digitalWrite(tx,HIGH);
digitalWrite(13,HIGH); //turn on debugging LED
SWprint('h'); //debugging hello
SWprint('i');
SWprint(10); //carriage return
}
void SWprint(int data)
{
byte mask;
//startbit
digitalWrite(tx,LOW);
delayMicroseconds(bit9600Delay);
for (mask = 0x01; mask>0; mask <<= 1) {
if (data & mask){ //choose bit
digitalWrite(tx,HIGH); //send 1
}
else{
digitalWrite(tx,LOW); //send 0
}
delayMicroseconds(bit9600Delay);
}
//stop bit
digitalWrite(tx, HIGH);
delayMicroseconds(bit9600Delay);
}
int SWread()
{
byte val = 0;
while (digitalRead(rx));
//wait for start bit
if (digitalRead(rx) == LOW) {
delayMicroseconds(halfBit9600Delay);
for (int offset = 0; offset < 8; offset++) {
delayMicroseconds(bit9600Delay);
val |= digitalRead(rx) << offset;
}
//wait for stop bit + extra
delayMicroseconds(bit9600Delay);
delayMicroseconds(bit9600Delay);
return val;
}
}
void loop()
{
SWval = SWread();
SWprint(toupper(SWval));
}
Ich habe die RX und TX pins 0 und 1 bzw., weil das sind die pins, die Cutedigi RS-232-chip verwendet. Nun, wenn ich öffnen Sie ein terminal-Fenster und geben Zeichen, ich bekomme unlesbare Zeichen und Buchstaben (wie diese: ¾_ò_òòËÌßÌËßÌÊÌòyofyofsæóÙöÇ æü æ
).
Entsprechend dem Beispiel-code Webseite, wenn ich Typ abcdefg
, das terminal-Fenster anzeigen soll ABCDEFG
.
Warum sollte dies der Fall sein? Ich hab die baud-rate auf 9600, wie angegeben, in der Skizze, aber ich bin noch immer Probleme. Zurücksetzen des Arduino scheint nicht zu helfen - ich bekomme immer noch unleserlicher text.
- Zwar gibt es definitiv einige software-Entwicklung Winkeln auf diese Frage, es ist wahrscheinlich eine bessere Passform für [electronics.stackexchange.com/]
- okay danke, gehen Sie voran und entfernen Sie diese post dann. Ich werde schauen in electronics.stackexchange.com
- Wenn Sie unlesbare Zeichen, dass in der Regel zeigt eine Baudrate überein.
- Entweder das, oder die Synchronisation auf das startbit wird ausgelöst durch Lärm. Ich würde hinzufügen eine debounce-Schleife, oder eine kleine retest für "if (digitalRead(rx) == LOW)" nach der Hälfte etwas pause.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich herausgefunden, was das Problem war.
Es stellt sich heraus, dass ich versucht hatte, Sie zum verbinden von zwei DCE-Geräten zusammen, was bedeutet, dass ein null-modem-adapter war notwendig, um ein vertauschen der TX/RX-pins auf die Kabel. Zuvor war ich mit einem einfachen "gender changer", aber dies ist, was verursacht meine Probleme.
Versuchen, immer ein null-modem-adapter, wenn Sie Probleme wie diese.