Forum: PC-Programmierung Visual Studio RS232 Baudrate


von Andreas G. (Gast)


Lesenswert?

Hallo zusammen,

ich arbeite derzeit an einem Programm, das mit einem Gerät über RS232 
kommunizieren soll, und habe dabei folgendes Problem:

Die Original-Software sendet, wenn man den "Verbinden"-Button klickt, 
mit Baudrate 600 eine Zeichenfolge, wechselt die Baud Rate (sieht man im 
Serial Monitor) zu 9600, und sendet eine weitere Zeichenfolge. Erst dann 
reagiert das Gerät auf die eigentlichen Befehle.

Ich habe nun keine Ahnung, wie ich "mitten drin" die Baudrate ändern 
kann. Im Notfall könnte man das natürlich über 2 Buttons realisieren, 
aber es gibt doch sicher eine Methode, damit erst ein Teil des Codes 
gesendet, dann die Baudrate geändert, und dann der zweite Teil des Codes 
gesendet wird, oder?

Hat jemand eine Idee wie man das realisieren könnte? Ggf. über einen 
Timer?

Danke im Voraus

von Top S. (topsoft)


Lesenswert?

Morgen,

welche Programiersprache nutzt du den? Wenn ein serieller Port geöffnet 
ist kann man, soweit ich weiß, die Baudrate nicht ändern. Also erst Port 
mit 600 Baud öffnen, Zeichenfolge senden, Port schließen. Dann Port mit 
9600 Baud öffnen und weiter machen.

Gruß

von Oliver S. (oliverso)


Lesenswert?

So ins Blaue geraten:
1
setBaudrate(600);
2
sendString(Zeichenfolge1);
3
setBaudrate(9600);
4
sendString(Zeichenfolge2);

Zugegebenermaßen verstehe ich aber dein Problem überhaupt nicht.

Oliver

von Jens P. (picler)


Lesenswert?

Oliver S. schrieb:
> setBaudrate(600);
> sendString(“Zeichenfolge1”);
> setBaudrate(9600);
> sendString(“Zeichenfolge2”);

Das funktioniert so nicht. Die Schnittstelle muss nach den 600Baud 
erstmal geschlossen werden und dann mit 9600Baud neu geöffnet werden. 
Das ist ohne Probleme möglich.

> Zugegebenermaßen verstehe ich aber dein Problem überhaupt nicht.

Ich ehrlich gesagt auch nicht. Dieser Versuch wäre doch recht simpel 
gewesen.

von cppbert (Gast)


Lesenswert?

Andreas G. schrieb:
> ich arbeite derzeit an einem Programm, das mit einem Gerät über RS232
> kommunizieren soll, und habe dabei folgendes Problem:

Wie heisst das Gerät, normalerweise suchen wir hier gerne kurz nach doku

> Die Original-Software sendet, wenn man den "Verbinden"-Button klickt,
> mit Baudrate 600 eine Zeichenfolge, wechselt die Baud Rate (sieht man im
> Serial Monitor) zu 9600, und sendet eine weitere Zeichenfolge. Erst dann
> reagiert das Gerät auf die eigentlichen Befehle.

Die Schnittstelle wird bestimmt mehfach geoeffnet und geschlossen

von cppbert (Gast)


Lesenswert?

Visual Studio ist auch nichtssagend, C/C++, MFC, .Net C#,VB?

von georg (Gast)


Lesenswert?

cppbert schrieb:
> Die Schnittstelle wird bestimmt mehfach geoeffnet und geschlossen

Microsoft Doku:

SetCommState function
Configures a communications device according to the specifications in a 
device-control block (a DCB structure). The function reinitializes all 
hardware and control settings, but it does not empty output or input 
queues.

Da steht nichts von Close und Open, es muss also nach der Beschreibung 
möglich sein, die Baudrate im Flug zu ändern, allerdings ist das eher 
unüblich.

Dass es mit Windows geht, heisst allerdings nicht dass das auch in der 
Programmiersprache möglich ist, die der TO so sorgfältig geheimhält.

Georg

von Andreas G. (Gast)


Lesenswert?

Hallo,

erstmal danke für die vielen Antworten.
Programmiersprache ist vb.net, da die Software für Windows CE 
geschrieben werden "muss", in Visual Studio 2008.

Zum Gerät: ist eine Platine, zu der niemand eine Doku hat.

 Habe mich wahrscheinlich doof ausgedrückt.

Nun ein kurzer Ausschnitt des Codes, damit man das Problem sieht.
Das Gerät erwartet HEX-Zeichen, deshalb nutze ich diese Methode zum 
senden.
Sobald "ersterCodeTeil" gesendet hat, passiert nichts mehr. Heißt ab 
"SerialPort1.baudrate = 9600" tut sich nichts mehr, die Baudrate bleibt 
auf 600 und "zweiterCodeTeil" wird nicht gesendet.
1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
2
        Timer1.Enabled = True
3
        SerialPort1.Open()
4
        SerialPort1.BaudRate = 600
5
        SerialPort1.DataBits = 8
6
        SerialPort1.Parity = Parity.Even
7
8
        Dim ersterCodeTeil() As Byte = {&H07, &H05, &H99, &H64, &H04, &H07, &H08}
9
10
        'Dim TestData(3) As Byte
11
12
        'TestData(0) = &HFE
13
14
        'TestData(1) = &H11
15
16
        'TestData(2) = &H11
17
18
        'TestData(3) = &HFF
19
20
        SerialPort1.Write(ersterCodeTeil, 0, 6)
21
        SerialPort1.BaudRate = 9600
22
        SerialPort1.DataBits = 8
23
        SerialPort1.Parity = Parity.None
24
25
        Dim zweiterCodeTeil() As Byte = {&H11, &H47, &H28, &H10}
26
        SerialPort1.Write(zweiterCodeTeil, 0, 3)

Jemand eine Idee?

von cppbert (Gast)


Lesenswert?

Dein Testdata wird komisch dimensioniert, es sind doch 4 bytes

Bei deinen port Writes schickst du glaube ich immer 1 byte zu wenig

Dein serial tracer sollte doch auch zeigen das du nicht das gleiche 
sendest

von cppbert (Gast)


Lesenswert?

Andreas G. schrieb:
> Das Gerät erwartet HEX-Zeichen

Nein erwartet es nicht, es erwartet Byte Werte die du in deinem Programm 
nach deinen persönlichen Wünschen, binär, oktal, dezimal oder 
hexadezimal formulieren kannst

von Andreas G. (Gast)


Lesenswert?

Okay, das habe ich soweit verstanden. Abgesehen von den Problemen der zu 
sendenden Daten (diese sind noch nicht vollständig), verstehe ich 
trotzdem nicht, warum ab "SerialPort1.baudrate = 9600" nichts mehr 
passiert, und der zweite Teil des Codes nicht gesendet wird.
Muss hier vielleicht doch mit einem Timer oder ähnlichem gearbeitet 
werden? Es kann ja nicht sein das nur ein Teil des Codes für den Button 
tatsächlich ausgeführt wird.

von cppbert (Gast)


Lesenswert?

Andreas G. schrieb:
> Okay, das habe ich soweit verstanden. Abgesehen von den Problemen
> der zu
> sendenden Daten (diese sind noch nicht vollständig), verstehe ich
> trotzdem nicht, warum ab "SerialPort1.baudrate = 9600" nichts mehr
> passiert, und der zweite Teil des Codes nicht gesendet wird.
> Muss hier vielleicht doch mit einem Timer oder ähnlichem gearbeitet
> werden? Es kann ja nicht sein das nur ein Teil des Codes für den Button
> tatsächlich ausgeführt wird.

Deine Writes enthalten Fehler, Das mit dem Hex hattest du nichts ganz 
verstanden, das Dim scheint falsch, dein Beispiel ist kein komplettes 
Minimalbeispiel, das Protokoll ist noch nicht ganz 
vollstaendig,...,......

Ich vermute noch weitere und andere Fehler, weil du leider den Anschein 
erweckst nicht sauber zu arbeiten
ausserdem haben wir keine Möglichkeit deine Analyse (Protokoll, 
Zeitverhalten, Baudratenwechsel) zu bestätigen

Kannst du bitte:

1. Ein Beispiel erstellen wo nur dieser Testcode drin ist, also nur ein 
Sub Main und das so lange verwenden bist das Problem gelöst ist, Update 
darin dann hier posten

2. Keinen fehler- oder Lückenhaften Code posten

3. Dein Serial Monitor Log hier einstellen, am besten mit Timing, 
markierte Baudumschaltung usw.

Es könnte einfach sein das du Müll schickst und dein Gerät dicht macht, 
oder sonst was

von Andreas G. (Gast)


Lesenswert?

Danke nochmal...
Habe nun ein neues Projekt erstellt. Nur ein Button, ein SerialPort(1), 
und einen Timer (der nur später zur Darstellung von Empfangenen Daten 
benötigt wird, das ist vorerst uninteressant).

Ob ich nun mit SerialPort1.Write(Code, 0, 3) zu wenige oder all Bytes 
sende, sollte vorerst ebenfalls unwichtig sein, da es mir noch gar nicht 
darum geht, ob das Gerät reagiert, weil ich im Serial Monitor bisher 
dachte, das nur der erste Teil des Code gesendet wird. Allerdings lag 
ich falsch.
Nach "SerialPort1.Write(ersterCodeTeil, 0, 6)" muss ich den Port einmal 
schließen, und wieder öffnen. Das sich die Baudrate "mitten drin" ändern 
muss, war völliger Blödsinn von mir.
Nun funktioniert (vorerst) alles wie es soll.

Danke für eure Hilfe!

von Rene K. (xdraconix)


Lesenswert?

Das hört sich ganz stark nach Arduino Bootloader an.

Dort wird dies genauso gehandhabt. Eventuell dort mal in die Source 
schauen.

Beitrag #6336381 wurde von einem Moderator gelöscht.
Beitrag #6336382 wurde von einem Moderator gelöscht.
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.