Forum: Mikrocontroller und Digitale Elektronik Initialsierungsvorgang RS232 passt NICHT


von Dan M. (luizaranha)


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:
1
s1=serial('Com6')% Comport Spezifikationen von Com6 werden in s1 %gespeichert.
2
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
1
void main(void)
2
{
3
 ..... some declarations ........
4
    // Set display messages:
5
6
    rmsg1="C-Control PRO ready for receiving\r\n";
7
     Serial_Init_IRQ(RS232,RS232Buffer,100,100,SR_8BIT|SR_1STOP|SR_NO_PAR,SR_BD19200);
8
    Serial_WriteText(RS232,rmsg1);               //Hier wirds falsch //gesendet
9
    Serial_WriteText(RS232,rmsg1);               //Hier wird s richtig //gemacht 
10
11
12
.... some more things
13
14
}
15
16
//Function definitions:
17
//void Msg_WriteText(char text[]);
18
//Beschreibung
19
//Es werden alle Zeichen des char array bis zur terminierenden Null //ausgegeben.
20
//Parameter
21
//text -->Zeiger auf char array
22
23
//void Serial_Init_IRQ(byte serport,byte ramaddr[],byte recvlen,byte //sendlen,byte par
24
25
//Die serielle Schnittstelle wird für die Benutzung im Interrupt Modus //initialisiert. Der Anwender muß eine
26
//globale Variable als Puffer bereitstellen. In diesem Puffer werden die //empfangenen Daten, sowie die zu
27
//sendenden Daten abgelegt. Die Größe des Puffers muß die Größe des //Empfangspuffers plus die Größe
28
//des Sendepuffers plus 6 sein . Der Sende- und der Empfangspuffer kann //maximal
29
//255 Zeichen aufnehmen.
30
//Für par wird der Wert durch Oderieren der vordefinierten Bitwerte //zusammengestellt. Man oderiert erst
31
//Zeichenlänge, dann Anzahl der Stopbits und dann Parity. Z.B. "SR_7BIT | //SR_2STOP | SR_EVEN_PAR" für
32
//7 Bit pro Zeichen, 2 Stop Bit und gerade Parität. Diese Werte sähen in //BASIC Syntaxwie folgt aus:
33
//"SR_7BIT Or SR_2STOP Or SR_EVEN_PAR". Die Baudrate wird als Teilerwert //angegeben, wie in der
34
//Tabelle spezifiziert.

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.