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ß
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
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} |
26 | SerialPort1.Write(zweiterCodeTeil, 0, 3) |
Jemand eine Idee?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.