Visual Studio RS232 Baudrate

Gast #6239267
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
#6239280
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ß
#6239290
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.
Gast #6239343
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
Gast #6239599
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
Gast #6239640
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?
Gast #6239695
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
Gast #6239745
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.
Gast #6239861
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
Gast #6239898
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!
Beitrag #6336381 wurde von einem Moderator gelöscht.
Beitrag #6336382 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren