Hallo, wollte mit einem PIC eine Verbindung über USB aufbauen indem ich über ein Terminal ein Zeichen sende und dann eine Antwort bekomme. Allerdings will die Übertragung nicht so recht funktionieren, dass heißt bei einer Aufforderung im Terminal funktioniert die Antwort nur sporadisch. Ich muss dazu sagen dass ich in diesem Bereich noch neu bin, was habe ich falsch gemacht? void serialInit() { // Das SYNC-Bit auf 0 gesetzt, weil hier der SCI-Modus nicht benötigt wird sync = 0; // Mit dem BRGH-Bit wird der Baudratenbereich ausgewählt, sollte es gesetzt // sein wird der High Speed Bereich aktiviert brgh = 1; spbrg = 129; // 9600 BAUD bei 20MHz Taktfrequenz // Durch das SPEN-Bit wird der Serial Port aktiviert, damit können die Pins // der USART-Schnittstelle konfiguriert werden spen = 1; txen = 1; // Der Datentransfer wird aktiviert cren = 1; // Der Datenempfang wird aktiviert(kontinuierlich) rcie = 1; //Für Interrupt rcif } char ser_getchar(long waittime) { do { // Wurden Daten empfangen, wird das RCIF-Bit gesetzt if (rcif) { // Empfangene Daten werden vom RCREG-Register geholt und zurückgegeben return(RCREG); } waittime--; } while(waittime==0); // Wartezeit wird abgezogen return(0xff); // Wenn Timeout, dann wird 0xff zurückgegeben } void ser_char(char zeichen) { //int n = 250; // Wenn der Buffer leer ist und Daten gesendet werden dürfen while(!trmt )//&& n==0 { // --n; delay_us(10); } TXREG = zeichen; putc(TXREG); // Daten werden in das TXREG-Register gespeichert,dann automatisch gesendet } void main() { set_tris_a(0b11111111); set_tris_b(0b11111111); set_tris_c(0b11111100); // Hier wird RC7 und RC6 als Eingang definiert (RCV-Pin) port_b_pullups(FALSE); serialInit(); // Initialisierung der RS232-Schnittstelle while (1) { char startwert; startwert = ser_getchar(100); delay_ms(500); switch(startwert) { case 0x30:ser_char( '!'); break;//Ascii 0 default: ser_getchar(100); break; } } }
Andi C. schrieb: > char ser_getchar(long waittime) > ... > waittime--; > } while(waittime==0); // Wartezeit wird abgezogen ^^^^^^^^^^^ So lange Schleife drehen, wie noch waittime vorhanden ist, ist } while(waittime); // Wartezeit wird abgezogen >void ser_char(char zeichen) > ... > TXREG = zeichen; > putc(TXREG); Es kann problematisch sein hier TXREG wieder zu lesen, weil das Auswirkungen auf die UART-Hardware haben kann. Besser zur Erzeugung des Echos diese Zeile verwenden: putc(zeichen); > void main() int main() > ... > switch(startwert) > { > case 0x30:ser_char( '!'); break;//Ascii 0 > default: ser_getchar(100); break; ^^^^^^^^^^^^^^^^^ Da können Zeichen verloren gehen. Nur eine zentrale Stelle zum Einlesen verwenden (die ist vor dem switch vorhanden).
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.