Abfrage der RS232 Schnittstelle
-
- Beiträge: 47
- Registriert: 21.02.2010 13:02
Abfrage der RS232 Schnittstelle
Hallo Leute,
ich benötige mal wieder eure Hilfe. Ich benötige bei uns ein kleines Purebasic-Programm welches an die COM1 Schnittstelle ein "R" sendet und die Daten welche von dieser zurückgeliefert werden (in dem Fall ein Gewicht z.B. 12.90KG) angezeigt werden. Ich habe schon einige Beispiele zur seriellen Schnittstelle gefunden aber leider nichts brauchbares für mich. Villeicht kann mir hier jemand von euch auf die Sprünge helfen. Daten der Schnittstelle, Baudrate 9600, Parity:even,Stopbit 1)
Vielen Dank Vorab
frankmannb
ich benötige mal wieder eure Hilfe. Ich benötige bei uns ein kleines Purebasic-Programm welches an die COM1 Schnittstelle ein "R" sendet und die Daten welche von dieser zurückgeliefert werden (in dem Fall ein Gewicht z.B. 12.90KG) angezeigt werden. Ich habe schon einige Beispiele zur seriellen Schnittstelle gefunden aber leider nichts brauchbares für mich. Villeicht kann mir hier jemand von euch auf die Sprünge helfen. Daten der Schnittstelle, Baudrate 9600, Parity:even,Stopbit 1)
Vielen Dank Vorab
frankmannb
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: Abfrage der RS232 Schnittstelle
Da ich das nicht testen kann, habe ich mal blind den Code
geschrieben. Darum kann ich für die Funktion dieses Beispiels
nicht garantieren. Ich hoffe aber, das du damit soweit das
Problem lösen kannst.
Gruß Falko
geschrieben. Darum kann ich für die Funktion dieses Beispiels
nicht garantieren. Ich hoffe aber, das du damit soweit das
Problem lösen kannst.
Code: Alles auswählen
If OpenSerialPort(0, "COM1", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "SerialPort opened with success")
If WriteSerialPortString(0,"R")
B_Anzahl.l=AvailableSerialPortInput(0)
If ReadSerialPortData(0,*Puffer,B_Anzahl)
Debug Puffer
EndIf
EndIf
Else
MessageRequester("Error", "Can't open the serial port: COM1")
EndIf
-
- Beiträge: 47
- Registriert: 21.02.2010 13:02
Re: Abfrage der RS232 Schnittstelle
Hallo Falco,
vielen Dank, ich werde das Beispiel am Montag mal testen.
Zunächste einmal vielen Dank
grüße frankmannb
vielen Dank, ich werde das Beispiel am Montag mal testen.
Zunächste einmal vielen Dank
grüße frankmannb
Falko hat geschrieben:Da ich das nicht testen kann, habe ich mal blind den Code
geschrieben. Darum kann ich für die Funktion dieses Beispiels
nicht garantieren. Ich hoffe aber, das du damit soweit das
Problem lösen kannst.
Gruß FalkoCode: Alles auswählen
If OpenSerialPort(0, "COM1", 900, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024) MessageRequester("Information", "SerialPort opened with success") If WriteSerialPortString(0,"R") B_Anzahl.l=AvailableSerialPortInput(0) If ReadSerialPortData(0,*Puffer,B_Anzahl) Debug Puffer EndIf EndIf Else MessageRequester("Error", "Can't open the serial port: COM1") EndIf
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: Abfrage der RS232 Schnittstelle
Ich habe wohl die 6 bei der Baudrate vergessen, wo vorhin 900 angezeigt wurde.
Das sollte natürlich 9600 heißen.
Dann bin ich mal gespannt ob es Montag funktioniert.
Was zum testen auch weiter helfen könnte, wäre ein virtueller COMPort,
der z.B. COM5 und COM6 simuliert. Somit könntest du zwei Programme
umschreiben, die sich gegenseitig bei Eingang von "R" oder "...KG" antworten
und das Ergebnis dann ausgeben.
Hier ein Link zum com0com: http://sourceforge.net/projects/com0com ... m/2.2.2.0/
Gruß Falko
Das sollte natürlich 9600 heißen.
Dann bin ich mal gespannt ob es Montag funktioniert.
Was zum testen auch weiter helfen könnte, wäre ein virtueller COMPort,
der z.B. COM5 und COM6 simuliert. Somit könntest du zwei Programme
umschreiben, die sich gegenseitig bei Eingang von "R" oder "...KG" antworten
und das Ergebnis dann ausgeben.
Hier ein Link zum com0com: http://sourceforge.net/projects/com0com ... m/2.2.2.0/
Gruß Falko
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: Abfrage der RS232 Schnittstelle
Hallo frankmannb
Ich habe nun mal den Versuch mit Com0Com (virtuelles COM) gemacht, welchen du vorher installiert und gestartet haben solltest, um es testen zu können.
der erste Source, der zuerst gestartet werden soll, gibt per Zufall bei jedem Aufruf ein Gewicht aus,
wenn er das "R" erhält. Das soll also die Hardware simulieren. Die COM CMCA0 und CMCB0 musst du natürlich
für dich anpassen. Der Zweite Source wird in der PB-IDE danach gestartet und sendet das erste laufende Programm das gewünschte "R" und erhält dann das zufällige Gewicht zurück. Ich hoffe das so der zweite Code für deine Hardware korrekt läuft. Vergiss den die obigen Beispiele.
Also hier der Source, der zuerst in der IDE ausgeführt werden muss und so lange läuft, bis du in PB das rote X
anklickst.
Und sofort danach folgenden Source ausführen. Am du öffnest in der IDE gleich beide Sources, sodass du oben nur auf den Tabs wechseln und mit F5 compilieren kannst.
Bei mir klappt das wunderbar. Bitte nicht den ersten Source als EXE compilieren und ausführen, da
das Programm nicht beendet wird und im Taskmanager zwangsbeendet werden muss.
Wichtig für dich ist nur der zweite Code, den du natürlich als Exe kompilieren kannst, wobei die Ausgabe
von Debug dann besser über ein MessageRequester ausgegeben werden sollte.
Gruß Falko
Ich habe nun mal den Versuch mit Com0Com (virtuelles COM) gemacht, welchen du vorher installiert und gestartet haben solltest, um es testen zu können.
der erste Source, der zuerst gestartet werden soll, gibt per Zufall bei jedem Aufruf ein Gewicht aus,
wenn er das "R" erhält. Das soll also die Hardware simulieren. Die COM CMCA0 und CMCB0 musst du natürlich
für dich anpassen. Der Zweite Source wird in der PB-IDE danach gestartet und sendet das erste laufende Programm das gewünschte "R" und erhält dann das zufällige Gewicht zurück. Ich hoffe das so der zweite Code für deine Hardware korrekt läuft. Vergiss den die obigen Beispiele.
Also hier der Source, der zuerst in der IDE ausgeführt werden muss und so lange läuft, bis du in PB das rote X
anklickst.
Code: Alles auswählen
;Simuliert die Hardware
If OpenSerialPort(0, "CNCB0", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "SerialPort opened with success")
While AvailableSerialPortInput(0)=0
If ReadSerialPortData(0,@Byte,1)
Puffer.s = Chr(Byte)
If Puffer = "R"
WriteSerialPortString(0, Str( Random(12000))+" Kg")
EndIf
EndIf
Wend
Else
MessageRequester("Error", "Can't open the serial port: COM1")
EndIf
Code: Alles auswählen
;hiermit wird die simulierte Hardware angesprochen.
If OpenSerialPort(0, "CNCA0", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "SerialPort opened with success")
If WriteSerialPortString(0,"R")
Delay(100)
While AvailableSerialPortInput(0)>0
If ReadSerialPortData(0,@Byte,1)
text.s=text.s+Chr(Byte)
EndIf
Wend
EndIf
Debug text
Else
MessageRequester("Error", "Can't open the serial port: COM1")
EndIf
das Programm nicht beendet wird und im Taskmanager zwangsbeendet werden muss.
Wichtig für dich ist nur der zweite Code, den du natürlich als Exe kompilieren kannst, wobei die Ausgabe
von Debug dann besser über ein MessageRequester ausgegeben werden sollte.
Gruß Falko
-
- Beiträge: 47
- Registriert: 21.02.2010 13:02
Re: Abfrage der RS232 Schnittstelle
Hallo Falko,
der Test funktioniert bei mir auch. Leider muss ich Zwei Waagen testen. Die erste benötigt zum übermitteln des Gewichtes die Übergabe des Buchstabens "R". Die 2. Waage benötigt ein "P" und ein anschließendes "ENTER". Wie kann ich denn das Enter an die Waage übergeben?
Danke für deine Hilfe frankmannnb
der Test funktioniert bei mir auch. Leider muss ich Zwei Waagen testen. Die erste benötigt zum übermitteln des Gewichtes die Übergabe des Buchstabens "R". Die 2. Waage benötigt ein "P" und ein anschließendes "ENTER". Wie kann ich denn das Enter an die Waage übergeben?
Danke für deine Hilfe frankmannnb
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: Abfrage der RS232 Schnittstelle
Ein einfaches carriage return (CR) für Enter oder RETURN wird in der Tabelle mit dem Ascii-Wert 13
angegeben, welches du einfach hinter dem "STRING"+chr(13), oder mithilfe der PB-Konstanten
"STRING"+#CR$ übergeben kannst. Bei einigen Returns benötigst du noch ein LF (ASCII-Code 10), ... +chr(13)+chr(10)
oder in PB gleich ... +#CRLF$. Das Plus ist nur um Strings mit diesen Steuerzeichen zusammen zu
senden.
Alle Steuerzeichen die du so wie hier angeben kannst, findest du in der Hilfe unter "Die ASCII-Codes..."
Viel Erfolg mit den Waagen.
Gruß Falko
angegeben, welches du einfach hinter dem "STRING"+chr(13), oder mithilfe der PB-Konstanten
"STRING"+#CR$ übergeben kannst. Bei einigen Returns benötigst du noch ein LF (ASCII-Code 10), ... +chr(13)+chr(10)
oder in PB gleich ... +#CRLF$. Das Plus ist nur um Strings mit diesen Steuerzeichen zusammen zu
senden.
Alle Steuerzeichen die du so wie hier angeben kannst, findest du in der Hilfe unter "Die ASCII-Codes..."
Viel Erfolg mit den Waagen.
Gruß Falko
-
- Beiträge: 47
- Registriert: 21.02.2010 13:02
Re: Abfrage der RS232 Schnittstelle
Hallo Falko,
vielen Dank für die schnelle Hilfe. Irgendwie funktioniert das zumindest mit der simulierten Hardware schonmal nicht. Wenn ich jetzt bei deinen Beispielen an das "R" noch das +#CRLFR oder +#CR$ anhänge funktioniert das ganze nicht mehr? Verstehe ich nicht.
vielen Dank für die schnelle Hilfe. Irgendwie funktioniert das zumindest mit der simulierten Hardware schonmal nicht. Wenn ich jetzt bei deinen Beispielen an das "R" noch das +#CRLFR oder +#CR$ anhänge funktioniert das ganze nicht mehr? Verstehe ich nicht.
Falko hat geschrieben:Ein einfaches carriage return (CR) für Enter oder RETURN wird in der Tabelle mit dem Ascii-Wert 13
angegeben, welches du einfach hinter dem "STRING"+chr(13), oder mithilfe der PB-Konstanten
"STRING"+#CR$ übergeben kannst. Bei einigen Returns benötigst du noch ein LF (ASCII-Code 10), ... +chr(13)+chr(10)
oder in PB gleich ... +#CRLF$. Das Plus ist nur um Strings mit diesen Steuerzeichen zusammen zu
senden.
Alle Steuerzeichen die du so wie hier angeben kannst, findest du in der Hilfe unter "Die ASCII-Codes..."
Viel Erfolg mit den Waagen.
Gruß Falko
- Falko
- Admin
- Beiträge: 3531
- Registriert: 29.08.2004 11:27
- Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.0 - Kontaktdaten:
Re: Abfrage der RS232 Schnittstelle
das liegt daran, das die simulierte Hardware nur ein Byte liest und somit das #CRLF$ niemals bekommen kann. Auf die Schnelle habe ich das mal geändert. Nur musst du dann jedesmal diese Empfängerroutine beenden und neustarten und dann dein Testprogramm starten.
Die simulierte Hardware, welche jetzt mehr als ein Byte einliest. (testempfang.pb)
An dem anderen Code ändert sich nur das, was ich dir beschrieben hatte:
Also hier nochmal die Testroutine: testsend.pb
testempfang.pb starten und danach testsend.pb starten und da sollte sich ein Zufallswert anzeigen.
Um das wiederholen zu können, testempfang.pb im Editor das rote X für programm abbrechen anklicken und erneut starten und danach wieder testsend.pb starten. Leider habe ich nicht viel Zeit wegen Spätschicht um es sauberer zu programmieren. Aber damit kannst du vorerst testen und einstellen usw.
Gruß Falko
Die simulierte Hardware, welche jetzt mehr als ein Byte einliest. (testempfang.pb)
Code: Alles auswählen
If OpenSerialPort(0, "CNCB0", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "SerialPort opened with success")
Repeat
While AvailableSerialPortInput(0)>0
If ReadSerialPortData(0,@Byte,1)
Puffer.s=Puffer.s + Chr(Byte)
If Puffer = "R"+#CRLF$ ; oder #CR$
WriteSerialPortString(0, Str( Random(12000)+1)+" Kg")
Delay(200)
Puffer=""
EndIf
EndIf
Wend
ForEver
EndIf
CloseSerialPort(0)
Also hier nochmal die Testroutine: testsend.pb
Code: Alles auswählen
;hiermit wird die simulierte Hardware angesprochen.
If OpenSerialPort(0, "CNCA0", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
MessageRequester("Information", "SerialPort opened with success")
If WriteSerialPortString(0,"R"+#CRLF$); oder #CRLF$
Delay(100)
While AvailableSerialPortInput(0)>0
If ReadSerialPortData(0,@Byte,1)
text.s=text.s+Chr(Byte)
EndIf
Wend
EndIf
Debug text
Else
MessageRequester("Error", "Can't open the serial port: COM CNCA0")
EndIf
Um das wiederholen zu können, testempfang.pb im Editor das rote X für programm abbrechen anklicken und erneut starten und danach wieder testsend.pb starten. Leider habe ich nicht viel Zeit wegen Spätschicht um es sauberer zu programmieren. Aber damit kannst du vorerst testen und einstellen usw.
Gruß Falko
-
- Beiträge: 47
- Registriert: 21.02.2010 13:02
Re: Abfrage der RS232 Schnittstelle
Hallo Falco,
danke vielmals für deine Hilfe, ich versuche mein Glück und gebe dir nachher Feddback.
grüße frankmannb
danke vielmals für deine Hilfe, ich versuche mein Glück und gebe dir nachher Feddback.
grüße frankmannb
Falko hat geschrieben:das liegt daran, das die simulierte Hardware nur ein Byte liest und somit das #CRLF$ niemals bekommen kann. Auf die Schnelle habe ich das mal geändert. Nur musst du dann jedesmal diese Empfängerroutine beenden und neustarten und dann dein Testprogramm starten.
Die simulierte Hardware, welche jetzt mehr als ein Byte einliest. (testempfang.pb)An dem anderen Code ändert sich nur das, was ich dir beschrieben hatte:Code: Alles auswählen
If OpenSerialPort(0, "CNCB0", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024) MessageRequester("Information", "SerialPort opened with success") Repeat While AvailableSerialPortInput(0)>0 If ReadSerialPortData(0,@Byte,1) Puffer.s=Puffer.s + Chr(Byte) If Puffer = "R"+#CRLF$ ; oder #CRLF$ WriteSerialPortString(0, Str( Random(12000))+" Kg") EndIf EndIf Wend ForEver EndIf
Also hier nochmal die Testroutine: testsend.pbtestempfang.pb starten und danach testsend.pb starten und da sollte sich ein Zufallswert anzeigen.Code: Alles auswählen
;hiermit wird die simulierte Hardware angesprochen. If OpenSerialPort(0, "CNCA0", 9600, #PB_SerialPort_EvenParity , 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024) MessageRequester("Information", "SerialPort opened with success") If WriteSerialPortString(0,"R"+#CRLF$); oder #CRLF$ Delay(100) While AvailableSerialPortInput(0)>0 If ReadSerialPortData(0,@Byte,1) text.s=text.s+Chr(Byte) EndIf Wend EndIf Debug text Else MessageRequester("Error", "Can't open the serial port: COM CNCA0") EndIf
Um das wiederholen zu können, testempfang.pb im Editor das rote X für programm abbrechen anklicken und erneut starten und danach wieder testsend.pb starten. Leider habe ich nicht viel Zeit wegen Spätschicht um es sauberer zu programmieren. Aber damit kannst du vorerst testen und einstellen usw.
Gruß Falko