Probleme serielle Datenübertragung

Gast #2000761
Lesenswert?
• ▲
▼
Hi.
Ich hab ein Messsystem aufgebaut, dass seine Messdaten per serieller 
Schnittstelle an einen PC senden soll. Der verwendete µC ist der 
PIC18F14K50 und an Software benutze ich den C18 Compiler und die 
Microchip IDE. Mein Problem ist, dass ich auf der PC Seite nicht alle 
Daten empfange, sondern nur ein Teil davon. Ich vermute den Fehler bei 
der Seriellen Kommunikation, da der Sensor soweit funktioniert (mit Oszi 
verifiziert). Am PC kommen nur alle 102 Messwerte an. Der Sendeteil des 
Programms sieht wie folgt aus:
...
char Buffer;
char result;

OpenUSART(  USART_TX_INT_OFF  &
    USART_RX_INT_OFF  &
    USART_ASYNCH_MODE  &
    USART_EIGHT_BIT  &
    USART_CONT_RX  &
    USART_BRGH_HIGH,77  )

while(!DataRdyUSART());  //Warten bis Daten empfangen
result = ReadUSART();

for (i = 0; i<102;i++)
{
  Buffer = ReceiveValue();  //8- Bit Messwert empfangen
  while(!TXSTAbits.TRMT);  //warten bis bereit zum Senden
  TXREG = Buffer;    // Senden
}
...
ReceiveValue liefert ein Byte (char) zurück.

Zur Kontrolle habe ich in dem Buffer einen festen Wert zugewiesen:
  Buffer = 'X';
PC seitig sehe ich im Terminalprogramm und auch in Matlab, den Wert 0x53 
also 'S'. Habt ihr ne Idee, was ich verbockt habe? Mir fällt langsam 
nichts mehr ein, woher der Fehler kommt.

Vielen Dank schon mal
#2000780
Lesenswert?
• ▲
▼
Manuel schrieb:

> Zur Kontrolle habe ich in dem Buffer einen festen Wert zugewiesen:
>   Buffer = 'X';
> PC seitig sehe ich im Terminalprogramm und auch in Matlab, den Wert 0x53
> also 'S'.

Versteh ich das richtig, dass dein PIC jetzt prinzipiell einfach nur 
Zeichen zurückschicken soll, die er empfangen hat. Nur das du das so 
umgeändert hast, dass immer ein 'X' zurück geschickt wird.

> Habt ihr ne Idee, was ich verbockt habe?

Wenn der Empfänger etwas anderes erkennt, als der Sender weggeschickt 
hat, dann ist das ein deutlicher Hinweis darauf, dass die Baudrate nicht 
exakt stimmt.
#2001124
Lesenswert?
• ▲
▼
Nachtrag zu meiner vorherigen Antwort:
Ich kenne den PIC nicht, gehe ich richtig in der Annahme daß mit diesem
Teil der Interrupt abgeschaltet wird

>  USART_RX_INT_OFF  & <

Ich würde hier Interrupts zulassen und eine kleine Serviceroutine dazu 
machen.

Ausserdem zum testen noch die Anregung das mal mit Hilfe einer LinuxCD 
z.B. Knoppix zu testen (falls Du Dich damit anfreunden kannst).

Von der CD booten und in einer Console den Befehl
"cat /dev/ttySx" eingeben. Das x muß durch 0 für COM1 bzw. 1 für COM2 
ersetzt werden.

Du solltest am Bildschirm die gesendeten Zeichen sehen, Baudrate etc. 
siehe vorige Antwort.
Gast #2002308
Lesenswert?
• ▲
▼
Hi Danke für die Antworten.
Wie ihr vermutet habt lag es an der Baudrate.
Ich hab das Programmgerippe, das ich benutzt hab nicht genau 
durchgesehen. Auf jeden Fall war noch die PLL aktiv, d.h. die Baudrate 
vom µC war ein ganz andere. Dann hat es natürlich in Matlab auch nicht 
richtig funktioniert.
Nun hab ich die PLL deaktiviert und nun funktionuerts wunderbar.

Vielen Dank

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.