mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Initialsierungsvorgang RS232 passt NICHT


Autor: Dan My (luizaranha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Kollegen,
habe mich in einem Horrornachtszenario zur richtigen Lösung für mein 
Problem durchgeackert.
Jetzt hab ich noch folgendes Problem:
dazu der folgende Code ausschnitt vor dem Einstieg in die 
Endlosschleife.
Folgendes Vorgehen bringt komische Ereignisse.

Ich lade mein Programm auf den uC. Dann beende ich den Compiler. Ich 
starte Matlab und führe folgenden Code aus:
s1=serial('Com6')% Comport Spezifikationen von Com6 werden in s1 %gespeichert.
fopen(s1);% serieller port wird geöffnet. 

Da der uC schon vorher gestartet ist, hat Matlab keine Bytes auf der 
seriellen Schnittstelle vom Serial_WriteText8..) empfangen, da Matlab 
erst später geöffnet wurde. Wenn ich jetzt das Programm mit Reset 
nochmal starten lasse, kann ich die Strings, die von Serial_WriteText 
gesendet wurden,empfangen.

Folgendes Problem dabei: Bei der ersten Ausführung von Serial_WriteText 
empfängt Matlab einen komischen String ('235§$% §§$% PRO ready for 
receiving'). Wird dieser Text ein zweites mal gesendet, dann kann Matlab 
ihn ohne Probleme lesen.
FRAGE: Liegt das Problem an Matlab oder am uC...sprich gibt es 
irgendwelche Initialisierungsmöglichkeiten, die solch einen falsche 
Rückgabe vermeiden??

ps. Baudraten und sonstige spezifikation sollten auf beiden Seiten 
gleich sein.

zum uC: (Conrad projectboard, MEGA32 ,Language: CompactC)

Danke für eure hilfe


Gruss Luiz
void main(void)
{
 ..... some declarations ........
    // Set display messages:

    rmsg1="C-Control PRO ready for receiving\r\n";
     Serial_Init_IRQ(RS232,RS232Buffer,100,100,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD19200);
    Serial_WriteText(RS232,rmsg1);               //Hier wirds falsch //gesendet
    Serial_WriteText(RS232,rmsg1);               //Hier wird s richtig //gemacht 


.... some more things

}

//Function definitions:
//void Msg_WriteText(char text[]);
//Beschreibung
//Es werden alle Zeichen des char array bis zur terminierenden Null //ausgegeben.
//Parameter
//text -->Zeiger auf char array

//void Serial_Init_IRQ(byte serport,byte ramaddr[],byte recvlen,byte //sendlen,byte par

//Die serielle Schnittstelle wird für die Benutzung im Interrupt Modus //initialisiert. Der Anwender muß eine
//globale Variable als Puffer bereitstellen. In diesem Puffer werden die //empfangenen Daten, sowie die zu
//sendenden Daten abgelegt. Die Größe des Puffers muß die Größe des //Empfangspuffers plus die Größe
//des Sendepuffers plus 6 sein . Der Sende- und der Empfangspuffer kann //maximal
//255 Zeichen aufnehmen.
//Für par wird der Wert durch Oderieren der vordefinierten Bitwerte //zusammengestellt. Man oderiert erst
//Zeichenlänge, dann Anzahl der Stopbits und dann Parity. Z.B. "SR_7BIT | //SR_2STOP | SR_EVEN_PAR" für
//7 Bit pro Zeichen, 2 Stop Bit und gerade Parität. Diese Werte sähen in //BASIC Syntaxwie folgt aus:
//"SR_7BIT Or SR_2STOP Or SR_EVEN_PAR". Die Baudrate wird als Teilerwert //angegeben, wie in der
//Tabelle spezifiziert.


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel Mayr schrieb:

> Folgendes Problem dabei: Bei der ersten Ausführung von Serial_WriteText
> empfängt Matlab einen komischen String ('235§$% §§$% PRO ready for
> receiving'). Wird dieser Text ein zweites mal gesendet, dann kann Matlab
> ihn ohne Probleme lesen.
> FRAGE: Liegt das Problem an Matlab oder am uC...

Das ist ein prinzipielles Problem einer RS232. Wird auf der Leitung 
ununterbrochen gesendet, dann gibt es keine zuverlässige Möglichkeit mit 
100% Sicherheit den Beginn des nächsten Zeichens zu erkennen. Erst dann, 
wenn der Sender eine Pause macht, gelingt es dem Empfänger sich mit 
Sicherheit auf den tatsächlichen Beginn des nächsten Zeichens zu 
synchronisieren.

> sprich gibt es
> irgendwelche Initialisierungsmöglichkeiten, die solch einen falsche
> Rückgabe vermeiden??

Nein.
Du kannst das höchstens in Software ansatzweise lösen.
zb der µC wartet, bis er von Matlab ein Zeichen bekommt und erst dann 
legt er los.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.