Hallo Zusammen PIC 32 ich versuche aus der Interrupt Routine wenn Daten am UART Part sind the "Chars" in mein main loop zu bekommen .... Ich habs mit einem globalen volatile unsigned char MM_STRING[]; versucht auf die die Interrupt Routine und Funktionen im Hauptprogramm zu greifen könnnen ... aber irgendwie funktioniert das nicht ... Ideen ? Gruß RL
if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID)) { int out_loop=0; while (out_loop < 9) /// { MM_STRING[out_loop] = UARTGetDataByte(XBEE_MODULE_ID); xbee_putchar(MM_STRING[out_loop]); // XBEE (MM_STRING[out_loop],out_loop); // XBEE (); out_loop++; if (MM_STRING[0] != "#") //return untill a valid String starts { // out_loop=0; // set start poin to 0 // break; } // xbee_putchar(MM_STRING[out_loop]); mPORTEToggleBits(LED_MMMODE); // funktioniert nicht da IO im Interrupt gesperrt sind // delay_ms(1); // this our inbox shoul look like putsUART2("#12344|9*") //out_loop++; if(MM_STRING[8] =='*') // check for the valid end and jump out { break; mPORTEToggleBits(LED_MMMODE); // funktioniert nicht da IO im Interrupt gesperrt sind }; } // Okay chek her if the strin is allright if(MM_STRING[0] =='#') { // great }; if(MM_STRING[6] =='|') { // great }; if(MM_STRING[9] =='*') { // great }; } // We don't care about TX interrupt if ( INTGetFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)) ) { INTClearFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)); // mPORTEToggleBits(LED_MMMODE); } }
if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID)) { int out_loop=0; while (out_loop < 9) /// { MM_STRING[out_loop] = UARTGetDataByte(XBEE_MODULE_ID); xbee_putchar(MM_STRING[out_loop]); // XBEE (MM_STRING[out_loop],out_loop); // XBEE (); out_loop++; if (MM_STRING[0] != "#") //return untill a valid String starts { // out_loop=0; // set start poin to 0 // break; } // xbee_putchar(MM_STRING[out_loop]); mPORTEToggleBits(LED_MMMODE); // funktioniert nicht da IO im Interrupt gesperrt sind // delay_ms(1); // this our inbox shoul look like putsUART2("#12344|9*") //out_loop++; if(MM_STRING[8] =='*') // check for the valid end and jump out { break; mPORTEToggleBits(LED_MMMODE); // funktioniert nicht da IO im Interrupt gesperrt sind }; } // Okay chek her if the strin is allright if(MM_STRING[0] =='#') { // great }; if(MM_STRING[6] =='|') { // great }; if(MM_STRING[9] =='*') { // great }; } // We don't care about TX interrupt if ( INTGetFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)) ) { INTClearFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)); // mPORTEToggleBits(LED_MMMODE); } }
Die Routne in main sieht sehr vereinfacht ungefähr so aus: main() { xbee_write_ramstring(MM_STRING); // put the whoel string back on uart delay_ms(1000); }
Zwar wird auf eine korrekte Rechtschreibung und Grammatik im Internet wenig Wert gelegt, dennoch erleichert sie es den anderen deinen Post zu verstehen. Bitte versuche dein Bestes korrekt zu schreiben und lies dir lieber deinen Post erst noch ein paar mal durch, bevor du ihn abschickst. Sowohl dein erster Beitrag ist sehr schwer verständlich, als auch deine Code-Anmerkungen in Deutsch/Englisch, die in beiden Sprachen gleichermaßen gravierende Fehler enthalten. Zum Code: Hier im Forum kann man mit [ c] ... [ /c] C-Code formatiert posten (steht übrigens fett oberhalb des Textfeldes zum Abschicken eines Beitrags). Bitte versuche es nocheinmal, denn deinen bisherigen Quellcode kann niemand entziffern. Falls er länger wird, so kannst du auch die C-Dateine an deinen Beitrag anhängen. Übrigens: Nutze die Vorschau-Funktion um zu sehen wie dein Beitrag aussehen wird. Nun wissen wir also, dass du ein Array in der Interrupt-Routen modifizierst und in der Main-Loop weiter benutzt. Also auch nicht viel mehr als zu Beginn. Was genau funktioniert denn nun nicht? Die Interrupt-Routine, das Senden, ...? Woher weißt du das? Wie hast du es ausgetestet? Funktioniert es denn wenn du nicht die Interrupt-Routine benutzt, sondern einfach nur in der Main-Loop die UART Daten direkt verarbeitest, d.h. mit
1 | if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID)) |
in der Main-Loop arbeitest? Eigentlich brauchst du ja die Interrupt-Routine vorerst nicht.
okay ich habs jetzt hingekriegt.... ganz wichtig scheinen die breaks; zu sein sonst funktionierts nicht if (UARTReceivedDataIsAvailable(XBEE_MODULE_ID)) { if (out_loop > 8) { out_loop=0; }; MM_STRING[out_loop] = UARTGetDataByte(XBEE_MODULE_ID); //xbee_putchar(MM_STRING[out_loop]); if(MM_STRING[8] =='*') // check for the valid end and jump out { // set flag succesfull transmition transmission = 1; }; if (MM_STRING[0] != '#') //return untill a valid String starts { out_loop=0; // set start poin to 0 while (1) { break; } } else { out_loop++; while (1) { break; } } // transmission = 0;// sai the main rotine the transmittion is not finish // int out_loop = 0; // while (out_loop < 9) /// // { // MM_STRING[out_loop] = UARTGetDataByte(XBEE_MODULE_ID); // xbee_putchar(MM_STRING[out_loop]); // XBEE (MM_STRING[out_loop],out_loop); // XBEE (); // if (MM_STRING[0] != '#') //return untill a valid String starts // { // out_loop=0; // set start poin to 0 // break; // Helper functions // } // // if (out_loop == 8) // { // transmission = 1; // } // xbee_putchar(MM_STRING[out_loop]); // mPORTEToggleBits(LED_MMMODE); // funktioniert nicht da IO im Interrupt gesperrt sind // delay_ms(1); // this our inbox shoul look like putsUART2("#12344|9*") //out_loop++; // } // Okay chek her if the strin is allright // if(MM_STRING[0] =='#') // { // great // }; // if(MM_STRING[6] =='|') // { // great // }; // if(MM_STRING[9] =='*') // { // great // }; //out_loop++; } // We don't care about TX interrupt if ( INTGetFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)) ) { INTClearFlag(INT_SOURCE_UART_TX(XBEE_MODULE_ID)); // mPORTEToggleBits(LED_MMMODE); } }
Mal angesehen davon, dass es etwas unhöflich ist, einen Beitrag zu posten, und genau dieselben Fehler zu machen, auf die man einen beitrag vorher hingewiesen wurde (C-Quellcode als solchen zu kennzeichnen)... ich bin dafür, folgenden teil (der sogar zweimal vorkommt) für den "useless code of the year" contest zu nominieren:
1 | while (1) |
2 | {
|
3 | break; |
4 | }
|
genial. "Literarisches Programmieren" in seiner Reinform. Sehr zeitgenössisch. Edit: Hab jetzt nachdenken müssen welches Versmaß das ist: Anapäst.
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.