Senden von Ganzzahlen über USART von PIC

Ich muss Ganzzahlen von meiner Mikrocontrollerkarte ( PIC16F877) an den PC senden. Ich benutze MAX232dafür. Ich muss einen ähnlichen Code verwenden (codiert mit mikroc 8.2) .

Bitte beachten Sie, dass dies nicht korrekt ist (tatsächlich Usart_Write(count);funktioniert die Leitung nicht wie beabsichtigt ). Aber es wird zeigen, was ich versuche zu tun.

#define BAUD_RATE 57600
#define DELAY 500
int count;

void interrupt(){
     if(INTCON.INTF == 1 ){
          count++;
          INTCON.INTF = 0;
     }
}

void setup(){
     INTCON = 0x90;
     TRISB = 0x01;
     Usart_Init(BAUD_RATE);
     count = 0;
}

void main() {
     setup();
     while(1){
        Usart_Write('>');
        Usart_Write(count);
        Usart_Write('<');
        count = 0;
        delay_ms(DELAY);
     }
}

Die Anwendung ist einfach. Die Variable counterwird mit Interrupt inkrementiert PORTB0und counterder Wert muss an gesendet werden PC.

Kann mir jemand einen korrekten (und einfachen) Weg zeigen, dies zu tun?

Was funktioniert im obigen Code nicht? (Mit welchem ​​Bit haben Sie Probleme?) Abgesehen davon, dass Sie count in der Hauptschleife auf 0 setzen (was Sie nicht tun sollten, wenn Sie möchten, dass es inkrementiert wird), sieht es nicht allzu schlecht aus.
Sollte das nicht bei Stackoverflow sein? Und ich denke, Sie sollten sich bemühen, es zuerst tatsächlich zu versuchen und dann das Problem bei Stackexchange zu posten
@OliGlaser soll die Geschwindigkeit eines rotierenden Rades mit einem digitalen Zähler berechnen. Der Interrupt erhöht sich, countwenn er ein Signal erhält. Aber ich lese den countWert in festen Abständen aus und sende die Werte an den PC. Dann muss ich natürlich den Zähler zurücksetzen. Es mag einen besseren Weg geben, dies zu erreichen, aber diese Methode ist nicht falsch. Das Problem ist, dass ich nicht weiß, wie ich den Integer-Wert über USART senden soll ...
Wenn Sie meinen, wie man es als ASCII-Werte darstellt, damit es auf dem PC "vom Menschen lesbar" ist, dann ist Tobys Antwort der richtige Weg. Es gibt einige nützliche Funktionen in der Standardbibliothek, die bei solchen Dingen helfen - lesen Sie die Dokumentation Ihrer Bibliothek, um zu sehen, welche Druckfunktionen verfügbar sind.

Antworten (3)

So wie ich es verstehe, besteht Ihr Problem darin, wie Sie eine Folge von ASCII-Zeichen drucken, die eine ganze Zahl darstellen.

Sie haben bereits eine Funktion, die ein Zeichen drucken kann, also möchten Sie etwa Folgendes:

char buf[16];
char *p;

sprintf(buf, "%d", count);
p = buf;
while(*p)
    Usart_Write(*p++);

Wenn Sie es nicht sprintf()in Ihrer C-Bibliothek haben, versuchen Sie es itoa().

(Hinweis für die Pedanten, snprintf()ist sicherer, wird aber nicht allgemein unterstützt)

Wann immer Sie überprüfen müssen, ob etwas funktioniert oder nicht, versuchen Sie, sich auf seine spezifischen Teile zu konzentrieren. Wie in diesem Code werden Sie keinen erhöhten Wert von count verpassen:-

void main() {
     setup();
     while(1){
        if(count)
        {
            Usart_Write('>');
            Usart_Write(count); //Your syntax is correct
            Usart_Write('<');
            count = 0;
        }
        delay_ms(DELAY);
     }
}
Stimme zu.. (aber keine Antwort, oder?)

Warum senden Sie keine Integer-Bytes?

char *p =(char*)&count;

send(*p);p++;
send(*p);p++;
send(*p);p++;
send(*p);

und auf der anderen Seite können Sie Bytes sammeln und eine Ganzzahl bilden, dies ist wahrscheinlich schneller als die Konvertierung in ein Char-Array.

Grüße, Lukas

Beachten Sie, dass nicht alle Systeme ein 32-Bit-Int haben, nicht alle Systeme aufgrund der Ausrichtung ein Casting von (int *) nach (char *) zulassen und das Mikro möglicherweise eine andere Endianness als der PC hat.
Ja, das müssen Sie berücksichtigen, aber Sie können immer wissen, wie groß der INT auf dem eingebetteten Gerät ist, oder Sie können Makros für verschiedene INTs schreiben. Über Endians auf PC und PIC können Sie sie immer schneller ändern als in ein Char-Array umzuwandeln.