Ich muss Ganzzahlen von meiner Mikrocontrollerkarte ( PIC16F877
) an den PC senden. Ich benutze MAX232
dafü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 counter
wird mit Interrupt inkrementiert PORTB0
und counter
der Wert muss an gesendet werden PC
.
Kann mir jemand einen korrekten (und einfachen) Weg zeigen, dies zu tun?
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);
}
}
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
Oli Glaser
chwi
Anubis
count
wenn er ein Signal erhält. Aber ich lese dencount
Wert 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 ...Oli Glaser