2017-08-23 3 views
0

Ich schreibe Code, um auf einem ATtiny von einem Arduino als ISP programmiert zu laufen. Das ATtiny soll AT-Befehle über eine serielle Verbindung an ein RN42-Bluetooth-Modul senden.Arduino SoftwareSerial Rx/Tx Pin Reihenfolge Fehler?

Da das ATtiny keinen UART hat, verwende ich SoftwareSerial an den Pins 0 und 1. Es erschien logisch, Tx auf den "Data Out"/MISO Pin und Rx auf den "Data In"/MOSI Pin zu setzen. Die Dokumentation besagt, dass dies wie SoftwareSerial mySerial (Rx, Tx) zu deklarieren ist; aber ich fand es funktioniert nur, wenn Sie es wie SoftwareSerial mySerial (Tx, Rx) umgekehrt erklären;

Ich habe einen Screenshot meines Codes und der Pinbelegung gemacht. Ich habe das Gefühl, dass mir etwas fehlt, aber wenn ich es so mache, funktioniert es und das Bluetooth-Modul wechselt in den Befehlsmodus. Ist die Dokumentation falsch herum?

Code and Pinout

+0

Überprüfen Sie das Diagramm in [diesem Beitrag] (https://stackoverflow.com/a/15552137/17034). Wie Sie sehen können, ist MOSI ein Ausgangspin aus der Sicht des Masters. Eine einfache Erklärung ist, dass die Webseite, die Sie gefunden haben, dokumentiert, dass sie als Sklave benutzt wird. Schwer zu sagen, ob das beabsichtigt ist, verwenden Sie keinen Screenshot, um Ihre Frage zu dokumentieren, wenn Sie auch eine URL angeben können. –

+0

Ja, ich verstehe deinen Standpunkt. Obwohl es bei weiterem Nachdenken wichtig sein sollte, wofür die Pins verwendet werden könnten, ist SoftwareSerial ein bisschen durchgeboxt, so dass sie nur als ein GPIO verwendet werden? –

Antwort

1

erkannte ich die wegen meiner Fehler, ich war unnötig die pinMode der Rx und Tx Pins einstellen. Das hat mich umgehauen, als ich dachte, den Rx-Pin auf OUTPUT zu setzen, würde nicht funktionieren, wenn es tatsächlich funktioniert, also gab ich Daten auf meiner Rx-Leitung aus und empfing sie auf der Tx-Leitung! Die Antwort ist, keine Richtung zuzuweisen und SoftwareSerial nur die Pins handhaben zu lassen. Übergeben Sie die Parameter in der Reihenfolge (Rx, Tx).

Hier ist mein sauberer Code, der viel besser funktioniert:

#include <SoftwareSerial.h> 

const int Rx = 0;       // pin 5 on ATtiny - DI/MOSI 
const int Tx = 1;       // pin 6 on ATtiny - DO/MISO 
const int ButtonIn = 2; 
const int OK_LED = 4; 
int buttonState = 0; 
SoftwareSerial serialBT(Rx, Tx); 

void setup() 
{ 
    pinMode(ButtonIn, INPUT); 
    pinMode(OK_LED, OUTPUT); 
    serialBT.begin(9600); 
} 

void loop() 
{ 
    buttonState = digitalRead(ButtonIn); 
    if (buttonState == 0) 
    { 
    serialBT.print("$");     // $$$ enters RN42 command mode 
    serialBT.print("$"); 
    serialBT.print("$"); 
    delay(3000); 

    serialBT.println("R,1"); 
    digitalWrite(OK_LED, HIGH); 
    delay(5000); 
    digitalWrite(OK_LED, LOW); 
    } 
} 
+0

Beachten Sie, dass Sie nach einiger Zeit Ihre eigene Antwort annehmen können. ;) –

Verwandte Themen