Frage

Ich mache ein 8051-Mikrocontroller drahtlos mit einem Computer kommunizieren. Der Mikrocontroller wird eine Zeichenfolge an seinen seriellen Port (DB9) senden und der Computer wird diese Zeichenfolge empfangen und sie manipulieren.

Mein Problem ist, dass ich weiß nicht, wie das 8051-Sende nur einmal die Zeichenfolge zu machen. Da ich die Saite am PC manipulieren, muß am Ende es nur einmal empfangen werden muss. Zur Zeit, obwohl in dem C-Code, den ich die Zeichenfolge einmal sandte, auf meinem Computer Ich erhalte die gleiche Zeichenfolge kontinuierlich. Ich nehme an, das liegt daran, dass alles, was in der SBUF ist kontinuierlich übertragen. Gibt es eine Möglichkeit, dass ich nur einmal meinen String senden kann? Gibt es eine Möglichkeit, die SBUF zu leeren?

Ich habe versucht, die RTS zu verwenden (Request to Send) Stift (7-polig) auf dem DB9, weil ich irgendwo gelesen, dass wenn ich die Spannung an diesem Pin negiert würde es den Fluss der Daten an den seriellen Port stoppen. Also, was ich tat, war meine Mikrocontroller programmiert, um die Zeichenfolge zu senden und dann gesendet Logikpegel 0 an einen Ausgangsstift, der an meinem DB9 RTS Pin angeschlossen wurde. das hat aber nicht funktioniert.

Hat jemand irgendwelche Vorschläge? Ich würde sie wirklich zu schätzen wissen.

EDIT

Die Software, die ich auf dem PC bin mit X-CTU für Xbee Module. Dies ist der Code auf meinem Mikrocontroller:

include reg51.h 
void SerTx(unsigned char);  
void main(void)  
{  
  TMOD = 0x20;  
  TH1 = 0xFD;  
  SCON = 0x50;  
  TR1 = 1;   

  SerTx('O');  
  SerTx('N');  
  SerTx('L');  
  SerTx('Y'); 

}

void SerTx(unsigned char x)  
{  
  SBUF = x;  
  while(TI==0);   
  TI = 0;   
}  

Könnte jemand bitte überprüfen, ob es in der Tat ist die Zeichenfolge nur einmal zu senden?

EDIT

Sieht aus wie Steve, brookesmoses und Neil den Nagel auf den Kopf getroffen, als sie sagten, dass es, was nach meiner Hauptfunktion vorging, die das Problem verursacht wurde. Ich habe gerade versucht, den vorgeschlagenen Code Steve up setzen (insbesondere die für (;;) und definieren serTX außerhalb der Haupt) und es funktionierte perfekt. Die Steuerung ist wahrscheinlich neu gestartet und damit der gleiche Code hält sich zu wiederholen.

Vielen Dank für die Hilfe! :)

War es hilfreich?

Lösung

Können Sie bestätigen, dass die 8051 die Daten wirklich nur einmal senden? Eine Möglichkeit, zu prüfen wäre, einen Rahmen zu verwenden, um zu sehen, was auf dem TX-Pin des UART geschieht.

Welche Software sind Sie auf dem PC? Ich würde mit einfacher Kommunikationssoftware wie Hyper-Terminal vorschlagen oder PuTTY . Wenn sie die Zeichenfolge zeigen mehrmals an den PC gesendet werden, dann sind die Chancen der Fehler in der Software ist auf der 8051 ausgeführt wird.

EDIT: Um ehrlich zu sein, das klingt wie die Art der Fehlersuche, die Ingenieure auf einer regelmäßigen Basis zu kämpfen haben, und es ist so eine gute Gelegenheit für Sie gute altmodische methodische problem- zu üben Lösung.

Wenn ich sehr stumpf sein kann, schlage ich vor, Sie wie folgt vor:

  1. Debug. Versuchen Sie, Dinge, aber nicht erraten . Experiment. Machen Sie kleine Änderungen im Code und sehen, was passiert. Versuchen Sie alles, was Sie sich vorstellen können. Web durchsuchen, um weitere Informationen.
  2. Wenn das nicht eine Lösung produzieren, dann wieder hier, und uns mit allen Informationen, die wir brauchen. Dazu gehören auch relevante Teile des Codes, die Einzelheiten der Hardware, die Sie verwenden, und Informationen über das, was Sie versucht haben, in Schritt 1.

EDIT: Ich habe nicht die rep, die Frage zu bearbeiten, also hier ist der Code von der OP in dem Kommentar zu ihrer Frage gestellt:

#include<reg51.h>

void SerTx(unsigned char);

void main(void)
{
    TMOD = 0x20; TH1 = 0xFD; SCON = 0x50; TR1 = 1;
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');

    void SerTx(unsigned char x)
        { SBUF = x; while(TI==0); TI = 0; } 
}

Als Neil und Brooksmoses in ihren Antworten erwähnen, in einem eingebetteten System, ist die Hauptfunktion nie zu beenden erlaubt. So müssen Sie entweder Ihren Code in einer Endlos-Schleife setzen (was kann das sein, was unbeabsichtigt geschieht), oder eine Endlos-Schleife am Ende hinzufügen, so dass das Programm effektiv stoppt.

Auch sollte die Funktion SerTx außerhalb Haupt definiert werden. Dies kann syntaktisch korrekt sein, aber es hält die Dinge einfach nicht Funktionen in anderen Funktionen deklarieren.

So versuchen, diese (ich habe auch einige Kommentare in einem Versuch hinzugefügt den Code leichter verständlich zu machen):

#include<reg51.h>

void SerTx(unsigned char);

void main(void)
{
    /* Initialise (need to add more explanation as to what
        each line means, perhaps by replacing these "magic
        numbers" with some #defines) */
    TMOD = 0x20;
    TH1  = 0xFD;
    SCON = 0x50;
    TR1  = 1;

    /* Transmit data */
    SerTx('O'); SerTx('N'); SerTx('L'); SerTx('Y');

    /* Stay here forever */
    for(;;) {}

}

void SerTx(unsigned char x)
{
    /* Transmit byte */
    SBUF = x;

    /* Wait for byte to be transmitted */
    while(TI==0) {}

    /* Clear transmit interrupt flag */
    TI = 0;
} 

Andere Tipps

Der Code, den Sie geschrieben hat keine Schleife in main (), so müssen Sie bestimmen, was Ihr Compiler C-Laufzeit tut, wenn main () zurückkehrt, nachdem ‚Y‘ zu senden. Gegeben Ihr Problem, denke ich, den Compiler einen Code erzeugt eine gewisse Bereinigung starten Sie das Mikro zu tun (vielleicht einen Hardware-Reset, vielleicht auch nur die C-Laufzeit wird neu zu starten). Es sieht aus wie Ihr Programm funktioniert genau so, wie Sie es geschrieben haben, aber Sie haben ignoriert, was vor und nach dem Haupt geschieht () aufgerufen wird.

Wenn Sie Ihre Zeichenfolge wollen einmal gesendet und nur einmal, überhaupt, dann müssen Sie etwas wie while(1) {} hinzugefügt, nachdem das letzte Zeichen gesendet wird. Aber dann Ihr Programm nichts tut - es wird nur eine leere Schleife ausführen für immer. Ein Reset (wie Power Cycling) benötigt, um wieder zu starten, und die Zeichenfolge senden.

Beachten Sie, dass, wenn Ihr Mikro einen Watchdog-Timer hat, könnte es eingreifen und eine unerwartete Rückstellung herbeiführen. Wenn dies geschieht, wird die Zeichenfolge für jedes Watchdog-Reset gesendet einmal werden (die so etwas wie einmal pro Sekunde sein könnten, mit der Rate auf Ihrer Hardware abhängig).

Auch mit serTx () verschachtelt definiert innerhalb main () ist wahrscheinlich nicht das, was Sie wollen.

Es ist schwer zu sagen, was das Problem ohne irgendeine des 8051-Code zu sehen. Zum Beispiel könnte ein logischer Fehler auf der Seite zu den Daten führt, dass mehrfach gesendet, oder die 8051-Software könnte für eine ACK warten, die niemals empfangen wird, etc.

Normalerweise auf einen 8051-Code muss explizit jedes Zeichen senden, aber ich nehme diese Betreuung durch die C-Laufzeit für Dich genommen wird.

Die Verwendung des RTS / CTS (Request To Send / Clear To Send) ist für die Ablaufsteuerung (das heißt Puffer Überschreitungen zu verhindern - die Puffer auf diesem Mikrocontroller in der Regel recht klein sind). Und nicht die Übertragung insgesamt zu stoppen

Neil Antwort Echoing (in einer Antwort, da ich die rep habe noch nicht kommentieren): In einer typischen Mikrocontroller Situation ohne Betriebssystem, es ist nicht sofort klar, was die Funktion exit (), die implizit am Ende aufgerufen wird von main () tun soll -. oder, genauer gesagt, kann es nicht die übliche tun „um das Programm beenden und zum O zurückzukehren“, denn es gibt kein Betriebssystem zurückzukehren ist

Darüber hinaus kann in einer realen Anwendung, die Sie wollen so gut wie nie das Programm nur stoppen, wenn Sie das System ausschalten. So eine Sache, die die exit () Umsetzung sollte auf jeden Fall nicht tun, ist eine Menge Code Platz in Anspruch nehmen.

In einigen Systemen habe ich gearbeitet, exit () ist eigentlich gar nicht umgesetzt - wenn Sie nicht es nicht benutzen wollen, nicht einmal ein Byte auf verschwenden! Das Ergebnis ist, dass, wenn der Ausführungspfad bis zum Ende des Hauptes gets (), der Chip wandert nur in eine lala Land Ausführung aus, was in dem nächsten Bit des Speichers wird passiert, und in der Regel endet schnell entweder fest in einer Schleife nach oben oder Verwerfungen mit einem illegalen Opcode. Und das übliche Ergebnis eines Fehlers mit einem illegalen Opcodes ... Neustart des Chips.

Das scheint wie eine plausable Theorie für das, was hier passiert.

Diese besondere Artikel ist für die Montage, nicht C, aber es könnte sich als nützlich erweisen: http://www.8052.com/tutser.phtml

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top