Fehler beim Lesen von Daten über UART unter Verwendung der Peripheriebibliothek in PIC32?

Ich versuche, Daten mit UART zu empfangen. Ich verwende den PIC32MX795F512L-Mikrocontroller und eine 32-Bit-Peripheriebibliothek, daher verwende ich Funktionen wie putsUART oder ReadUART1 Now im Code:

int main()
{
 OpenUART1( UART_EN | UART_NO_PAR_8BIT | UART_1STOPBIT  , UART_RX_ENABLE | UART_TX_ENABLE, (FPB/16/BAUDRATE)-1 );
 TRISDbits.TRISD5 = 0;
  while(1)
  {
    char RX_data;
    RX_data = ReadUART1();
    if(RX_data == '1')
    {
      LATDbits.LATD5 = 1;
      putsUART1("LED ON");
     }

     elseif(RX_data == 'q')
     {
       LATDbits.LATD5 = 0;
       putsUART1("LED OFF");
      }
   }
}

Wenn ich jetzt 1 in das Terminal eintippe, leuchtet die LED auf, aber wenn ich q eingebe, erlischt die LED nicht. Es funktioniert mit Ziffern, aber nicht mit Buchstaben. Wie wenn ich es tue

elseif(Rx_data == '2')

Dann klappt es aber nicht mit

elseif(RX_data == 'q')

Ich weiß nicht, wo ich den Punkt verfehle. Bitte helfen Sie.

Geben Sie 'q' ein, nachdem Sie 'l' eingegeben haben? Oder führen Sie die Firmware erneut aus, wenn Sie 'q' eingeben?
Ja, ich tippe q nach 1
Möglicherweise sendet Ihre Terminalsoftware nach dem Zeichen „1“ ein CR- oder LF-Zeichen oder beides, und deshalb verlieren Sie das „q“-Lesen. Probieren Sie aus, ob Ihre Terminalsoftware über eine Option zum automatischen Anhängen von CR/LF-Zeichen an eine Übertragung verfügt.
Ich verwende Docklight. Es sendet kein CR LF
Der Code, den Sie gerade in Ihrer Bearbeitung gepostet haben, kann nicht kompiliert werden. 'rx' existiert nicht mehr und es gibt kein Leerzeichen zwischen else und if. Wenn dies direkt aus Ihrem Code stammt, was es sein sollte, dann flashen Sie einfach immer wieder Ihre alte Binärdatei
@Asmyldof das war aus Versehen. Ich habe die Änderungen vorgenommen
Warum deklarieren Sie RX_data in einer Endlosschleife?
Warum geben Sie Ihren Lesevorgang nicht direkt auf dem UART zurück, damit Sie sehen können, wo das Problem liegt?

Antworten (2)

Angenommen, Sie möchten nur das eine oder andere tun, müssen Sie Ihren Code wie folgt ändern:

char RX_data = ReadUART1();
if(RX_data == '1')
{
    LATDbits.LATD5 = 1;
    putsUART1("LED ON");
}
else if(RX_data == 'q')
{
    LATDbits.LATD5 = 0;
    putsUART1("LED OFF");
}

Wenn Sie Ihren ursprünglichen Code logisch durchgehen, werden Sie sehen, dass er bei der Eingabe von „q“ gelesen und mit „1“ verglichen wird, was nicht übereinstimmt, aber dann führen Sie einen weiteren Lesevorgang durch, sodass Sie das „q verlieren ', die Sie bereits gelesen haben.

Ich weiß nicht, warum es nicht funktioniert, ich habe es gemäß Ihrer Antwort gemacht. Alles scheint perfekt, aber die Ausgabe wird immer noch nicht angezeigt
@ user46573544 Ich habe gerade deinen Code kopiert, von dem du sagst, dass er für '1' funktioniert. Tatsächlich ist der Vergleich von an intmit a chargültig, solange die Werte den Bereich von nicht überschreiten char. Ich habe meine Antwort geändert, um genauer zu sein, aber wenn dieser Code nicht funktioniert, müssen Sie etwas mehr Kontext zeigen. Ich gehe davon aus, dass dies innerhalb einer whileSchleife ist. Stellen Sie sicher, dass Sie nur einmal lesen und dann alle Möglichkeiten testen.
Ich habe nicht gearbeitet. Das ist der einzige Code, den ich habe. Ich lese es einmal und überprüfe dann alles, wenn sonst. Es könnte ein anderer Fehler vorliegen.
@ user46573544 Dieses Stück Code befindet sich also nicht in einer while (1) { ... }Schleife? Bitte ändern Sie Ihre Frage und posten Sie die gesamte mainFunktion.
ja, es ist drinnen während (1). Ich habe meinen Code bearbeitet
Es funktioniert mit 2 oder einer anderen Ziffer, aber nicht mit Buchstaben. Seltsam Hast du eine Ahnung davon?
@user46573544 Hast du die Feststelltaste auf deiner Tastatur? Vielleicht tippst du 'Q' statt 'q'. Wenn Sie die Hardware zum Debuggen haben, setzen Sie nach dem Lesen einen Haltepunkt und sehen Sie, was Sie gelesen haben.
Ich habe versucht, es zu debuggen. Wenn ich 1seinen Wert eingebe, wird angezeigt, 0x31welches gemäß ASCII korrekt ist. Wenn ich jetzt eintrete, qwird angezeigt 0xF1, was nicht in der ASCII-Tabelle enthalten ist. Ich habe auch versucht, es einzugeben, 2also zeigt es, 0x32was bedeutet, dass 2ich es dann mit versucht habe w, es wird 0xE1wieder nicht in ASCII angezeigt. Es nimmt keine Buchstaben auf. Ich weiß nicht warum. Irgendeine Idee.!
Wenn Sie 0xF1 sehen, wenn Sie 0x71 ('q') erwarten, kann es sein, dass Ihre Parität, Datenbitgröße oder Stoppbits falsch sind. Überprüfen Sie Ihre Konfiguration an beiden Enden. Versuchen Sie auch, die Baudrate zu reduzieren.
An beiden Enden stimmt alles
@ user46573544 Wenn ja, dann ist dies kein Codeproblem mehr, sondern ein Hardwareproblem und erfordert möglicherweise ein Debugging mit einem Bereichs- und/oder Logikanalysator und gegebenenfalls eine neue Frage.

Wenn ReadUART()es dir schwer fällt. Sie können andere Optionen wie verwendengetsUART1()

Das Dokument sagt:

Beschreibung: Diese Funktion liest eine Datenkette der angegebenen Länge und speichert sie an der angegebenen Pufferstelle.

Enthalten: plib.h

Prototyp: unsigned int getsUART1 (unsigned int length,char *buffer, unsigned int uart_data_wait);

Codebeispiel: getsUART1(12, myBuffer, 123);

Oder Sie könnten versuchen, Werte in die UART-Register einzugeben.