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
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ß
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.
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
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
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}
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
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
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.
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
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!