Aktuelle Zeit: 05.04.2020 14:41

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 03.02.2011 22:55 
Offline

Registriert: 21.02.2010 13:02
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 04.02.2011 23:47 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 05.02.2011 22:35 
Offline

Registriert: 21.02.2010 13:02
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:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 06.02.2011 19:44 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 07.02.2011 00:52 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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:
;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:
;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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 07.02.2011 10:29 
Offline

Registriert: 21.02.2010 13:02
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 07.02.2011 10:38 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 07.02.2011 10:49 
Offline

Registriert: 21.02.2010 13:02
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 07.02.2011 11:19 
Offline
Admin
Benutzeravatar

Registriert: 29.08.2004 11:27
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:
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:
;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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Abfrage der RS232 Schnittstelle
BeitragVerfasst: 07.02.2011 11:26 
Offline

Registriert: 21.02.2010 13:02
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:
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:
;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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye