Abfrage der RS232 Schnittstelle

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
frankmannb
Beiträge: 47
Registriert: 21.02.2010 13:02

Abfrage der RS232 Schnittstelle

Beitrag von frankmannb »

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
Benutzeravatar
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

Beitrag von Falko »

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.

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

Gruß Falko
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
frankmannb
Beiträge: 47
Registriert: 21.02.2010 13:02

Re: Abfrage der RS232 Schnittstelle

Beitrag von frankmannb »

Hallo Falco,

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.

Code: 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

Gruß Falko
Benutzeravatar
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

Beitrag von Falko »

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. :allright:

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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
Benutzeravatar
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

Beitrag von Falko »

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.

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
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.

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
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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
frankmannb
Beiträge: 47
Registriert: 21.02.2010 13:02

Re: Abfrage der RS232 Schnittstelle

Beitrag von frankmannb »

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
Benutzeravatar
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

Beitrag von Falko »

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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
frankmannb
Beiträge: 47
Registriert: 21.02.2010 13:02

Re: Abfrage der RS232 Schnittstelle

Beitrag von frankmannb »

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.
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
Benutzeravatar
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

Beitrag von Falko »

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)

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)
An dem anderen Code ändert sich nur das, was ich dir beschrieben hatte:
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
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
Bild
Win10 Pro 64-Bit, PB_5.4,GFA-WinDOS, Powerbasic9.05-Windows, NSBasic/CE, NSBasic/Desktop, NSBasic4APP, EmergenceBasic
frankmannb
Beiträge: 47
Registriert: 21.02.2010 13:02

Re: Abfrage der RS232 Schnittstelle

Beitrag von frankmannb »

Hallo Falco,

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)

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
An dem anderen Code ändert sich nur das, was ich dir beschrieben hatte:
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
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
Antworten