Serielle Abfrage ohne zu wissen was dran ist ?!
Serielle Abfrage ohne zu wissen was dran ist ?!
Hallo !
Ein Bekannter von mir hat eine Waage, die an der Seriellen Schnittstelle installiert wurde. Er hat ein Steuergerät gehabt, welches die Wage ausliest und einen BON ausdruckt, auf dem dann steht um welche Zeit wieveiel Gewicht auf der Waage war.
Nun ist das Gerät ausgefallen und das neue kommt erst in 3 Wochen.
Er hat einen PC an der Waage stehen und will nun die Waage daran anschließen und auslesen lassen. Es soll gehen. Nur haben wir keinerlei Daten über die Waage.
Ist es möglich die Serielle einfach abzufragen und ausgeben zu lassen, was da gerade abgefragt wurde. Ich weiß man soll hier nicht nach fertigen Codes fragen, aber ich habe mit den Com Ports so gut wie nichts gemacht und weiß nicht darüber. Könnte mir jemand wenigstens ein Beispiel posten, wie ich mit der COM1 kommuniziere und Daten auslese ?
Ich weiß daß die MVCom Lib benötigt wird, aber mehr noch nicht !
Ich mache alles wieder gut !
Ein Bekannter von mir hat eine Waage, die an der Seriellen Schnittstelle installiert wurde. Er hat ein Steuergerät gehabt, welches die Wage ausliest und einen BON ausdruckt, auf dem dann steht um welche Zeit wieveiel Gewicht auf der Waage war.
Nun ist das Gerät ausgefallen und das neue kommt erst in 3 Wochen.
Er hat einen PC an der Waage stehen und will nun die Waage daran anschließen und auslesen lassen. Es soll gehen. Nur haben wir keinerlei Daten über die Waage.
Ist es möglich die Serielle einfach abzufragen und ausgeben zu lassen, was da gerade abgefragt wurde. Ich weiß man soll hier nicht nach fertigen Codes fragen, aber ich habe mit den Com Ports so gut wie nichts gemacht und weiß nicht darüber. Könnte mir jemand wenigstens ein Beispiel posten, wie ich mit der COM1 kommuniziere und Daten auslese ?
Ich weiß daß die MVCom Lib benötigt wird, aber mehr noch nicht !
Ich mache alles wieder gut !
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Wenn du gar keine Unterlagen hast, ist das ein ziemlich sinnloses Unterfangen.
Du weisst ja absolut nix über das Verständigungsprotokoll.
Ist es ASCII, Binär , wie bringt man sie überhaupt zum antworten ?
Zum rumspielen würde ich dir einfach mal raten den Hyperterminal, oder irgendein anderes V24-Terminal-Programm anzuwerfen und zu versuchen irgendwie mit der Waage zu kommunizieren.
Da du wahrscheinlich nicht mal die verwendete Baudrate kennst, wirst du damit aber wahrscheinlich auch nicht wirklich weiterkommen (Trial & Error...).
Wenn das neue Gerät da ist, kannst du dich einfach dazwischen klemmen und "mithorchen" (falls dann überhaupt noch interesse besteht) und evtl. ein PB-Prog draus basteln.
Du weisst ja absolut nix über das Verständigungsprotokoll.
Ist es ASCII, Binär , wie bringt man sie überhaupt zum antworten ?
Zum rumspielen würde ich dir einfach mal raten den Hyperterminal, oder irgendein anderes V24-Terminal-Programm anzuwerfen und zu versuchen irgendwie mit der Waage zu kommunizieren.
Da du wahrscheinlich nicht mal die verwendete Baudrate kennst, wirst du damit aber wahrscheinlich auch nicht wirklich weiterkommen (Trial & Error...).
Wenn das neue Gerät da ist, kannst du dich einfach dazwischen klemmen und "mithorchen" (falls dann überhaupt noch interesse besteht) und evtl. ein PB-Prog draus basteln.
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Hab ich gestern schon mal geantwortet, und beim Abschicken war das bl..e Forum nicht mehr erreichbar, Mist das.
Ein Terminalprogramm findest Du unter: http://bray.velenje.cx/avr/terminal/
Damit kannst Du schauen, ob die Waage was sendet. Mit einem Oszi könntest Du aus den Signalen die Baudrate und das Datenformat ermitteln. Ansonsten mal verschiedene Baudraten durchspielen. Event. musst Du die Hardware-Handshake-Leitungen setzen, damit die Waage merkt, da ist was.
Wenn Du Pech hast, sendet die Waage nur auf Befehl. Dann kommst Du ohne die Befehle nicht weiter. Gibt's kein Handbuch dazu? Nix bei Google gefunden? Was ist es denn für eine Waage?
Wenn das alte Steuergerät noch kommunizieren kann (also nur Drucker kaputt), könnte man versuchen, die Signale per Oszi oder zwischengeschalteten PC (2 serielle Schnittstellen durchgeschleift) die Befehle mitzulesen.
Sven
Ein Terminalprogramm findest Du unter: http://bray.velenje.cx/avr/terminal/
Damit kannst Du schauen, ob die Waage was sendet. Mit einem Oszi könntest Du aus den Signalen die Baudrate und das Datenformat ermitteln. Ansonsten mal verschiedene Baudraten durchspielen. Event. musst Du die Hardware-Handshake-Leitungen setzen, damit die Waage merkt, da ist was.
Wenn Du Pech hast, sendet die Waage nur auf Befehl. Dann kommst Du ohne die Befehle nicht weiter. Gibt's kein Handbuch dazu? Nix bei Google gefunden? Was ist es denn für eine Waage?
Wenn das alte Steuergerät noch kommunizieren kann (also nur Drucker kaputt), könnte man versuchen, die Signale per Oszi oder zwischengeschalteten PC (2 serielle Schnittstellen durchgeschleift) die Befehle mitzulesen.
Sven
- Sylvia
- verheiratet<br>1. PureGolf-Gewinner
- Beiträge: 487
- Registriert: 29.08.2004 09:42
- Wohnort: Old Europe
Mit anderen Programmiersprachen ist es kein Problem, über div.Kommandos
auch für Unerfahrene mal eben schnell eine ext.Geräteverbindung herzustellen.
Fred hält nichts davon, mit irgendeiner Schnittstelle (ser/par/USB/Ports) Verbindung mit
der Aussenwelt aufzunehmen. Deswegen hat PB auch keine Befehle dafür. Alles
Leben spielt sich in der kleinen, abgeschlossenen Hardware-Welt des Rechners ab.
Wer dennoch sein Kopf aus dem Fenster strecken möchte, muss sich per API abmühen
oder sich div.Hilfsprogrammen (MVCOM/IO usw.) bedienen.
auch für Unerfahrene mal eben schnell eine ext.Geräteverbindung herzustellen.
Fred hält nichts davon, mit irgendeiner Schnittstelle (ser/par/USB/Ports) Verbindung mit
der Aussenwelt aufzunehmen. Deswegen hat PB auch keine Befehle dafür. Alles
Leben spielt sich in der kleinen, abgeschlossenen Hardware-Welt des Rechners ab.

Wer dennoch sein Kopf aus dem Fenster strecken möchte, muss sich per API abmühen
oder sich div.Hilfsprogrammen (MVCOM/IO usw.) bedienen.

Basic Pur = PureBasic
Also, ich war heute an dieser Waage dran und habe folgendes herausgefunden :
Die Einstellungen zum öffnen :
damit habe ich definitiv ne verbindung, wobei E für EVEN=GERADE steht.
Mit HYPERTERMINAL habe ich zugriff auf diese Waage und wenn ich "STRG"+"E" sende, wird sofort das Gewicht ausgeworfen.
Demnach stimmt die Verbindung und die Einstellungen (oben) stimmern auch !
Wie kann ich ein STRG senden ?? Geht das mit CHR(17) ??
Wo werden bei MVCom die Daten abgelegt, damit ich den String auch lesen kann ?? Weiß das jemand. Es wird immer nur NULL ausgegegben und ich habe nicht die geringste Idee, wo da der String evtl im Speicher steht. Kann man Telnet fernsteuern oder gar komplett ausm PB sowas steuern ? Das schein jedenfalls einwandfrei zu funktionieren
Die Einstellungen zum öffnen :
Code: Alles auswählen
Port.s = "com1:4800,e,7,1"
Handshake.l = 1
Buffer.l = 1024
HCom.l = ComOpen(Port, Handshake,Buffer,Buffer)
If HCom > 0
ComClose(HCom)
EndIf
Mit HYPERTERMINAL habe ich zugriff auf diese Waage und wenn ich "STRG"+"E" sende, wird sofort das Gewicht ausgeworfen.
Demnach stimmt die Verbindung und die Einstellungen (oben) stimmern auch !
Wie kann ich ein STRG senden ?? Geht das mit CHR(17) ??
Wo werden bei MVCom die Daten abgelegt, damit ich den String auch lesen kann ?? Weiß das jemand. Es wird immer nur NULL ausgegegben und ich habe nicht die geringste Idee, wo da der String evtl im Speicher steht. Kann man Telnet fernsteuern oder gar komplett ausm PB sowas steuern ? Das schein jedenfalls einwandfrei zu funktionieren
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
- Falko
- Admin
- Beiträge: 3535
- 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.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit) - Kontaktdaten:
Ich kann es leider nicht nachvollziehen. Dazu müsste ich einen zweiten PC anschliessen und das ganze simulieren. Nur ist es eben nicht das Gleiche
Es gibt in der MVCOM ein gutes Beispiel.
Schau dir mal genau ComInput in der Hilfe an. Dort wird z.B. ein
Hello world... mit der Stringvariablen Chaine.s gesendet wo theoretisch dann ein Chr(17) stehen könnte. Über die Variable Car.s müsste eigendlich die Antwort nach dem While ComInput kommen.
Ich hoffe du kommst damit weiter.
MfG Falko

Es gibt in der MVCOM ein gutes Beispiel.
Schau dir mal genau ComInput in der Hilfe an. Dort wird z.B. ein
Hello world... mit der Stringvariablen Chaine.s gesendet wo theoretisch dann ein Chr(17) stehen könnte. Über die Variable Car.s müsste eigendlich die Antwort nach dem While ComInput kommen.
Ich hoffe du kommst damit weiter.
MfG Falko
leider kommt da nichts an... NbCar bleibt auf 0 ...
Bei Hyperterminal werden sofort 14 buchstaben ("123456789012Kg") empfangen, nur bei PB klappts nicht.. gibts ein Command Line Methode dafür, die ich mich RunProgram aufrufen kann ??

Bei Hyperterminal werden sofort 14 buchstaben ("123456789012Kg") empfangen, nur bei PB klappts nicht.. gibts ein Command Line Methode dafür, die ich mich RunProgram aufrufen kann ??
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
- HeX0R
- Beiträge: 3042
- Registriert: 10.09.2004 09:59
- Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3 - Kontaktdaten:
Versuch mal das:
Hab auch mal die ganzen Bedeutungen von den Flags einkommentiert.
Evtl. damit ein wenig spielen...
Hab auch mal die ganzen Bedeutungen von den Flags einkommentiert.
Evtl. damit ein wenig spielen...
Code: Alles auswählen
Procedure.l Open_Com(com.l, baud.l, Buffer_in.l, Buffer_out.l, Parity.l, ByteSize.l, StopBits.l, flags.l, TimeOUT.l)
*FileID = CreateFile(com, "COM" + Str(com) + ":")
If *FileID
If GetCommState_(*FileID, @PortConfig.DCB)
SetupComm_(*FileID, Buffer_in, Buffer_out)
TimeOut_Const.l = 1
ct.COMMTIMEOUTS
ct\ReadIntervalTimeout = #MAXDWORD
ct\ReadTotalTimeoutMultiplier = TimeOut
ct\ReadTotalTimeoutConstant = TimeOut_Const
ct\WriteTotalTimeoutMultiplier = TimeOut
ct\WriteTotalTimeoutConstant = TimeOut_Const
SetCommTimeouts_(*FileID, ct)
;flags:
;Bit 0 -> binary mode MUST BE TRUE
;Bit 1 -> Parity chacking is performed and errors are reported
;Bit 2 -> If this member is TRUE, the CTS (clear-to-send) signal
; is monitored For output flow control.
; If this member is TRUE And CTS is turned off, output is suspended
; until CTS is sent again
;Bit 3 -> If this member is TRUE, the DSR (data-set-ready) signal is monitored
; For output flow control. If this member is TRUE And DSR is turned off,
; output is suspended Until DSR is sent again
;Bit 4-5 -> 00 = Disables the DTR line when the device is opened and leaves it disabled.
; 01 = Enables the DTR line when the device is opened and leaves it on.
; 10 = Enables DTR handshaking. If handshaking is enabled, it is an error for the application
; To adjust the line by using the EscapeCommFunction function
;Bit 6 -> If this member is TRUE, the communications driver is sensitive to the state of the DSR signal.
; The driver ignores any bytes received, unless the DSR modem input line is high.
;Bit 7 -> If this member is TRUE, transmission continues after the input buffer has come within
; XoffLim bytes of being full And the driver has transmitted the XoffChar character To stop
; receiving bytes. If this member is FALSE, transmission does not Continue Until the input buffer
; is within XonLim bytes of being empty And the driver has transmitted the XonChar character To resume reception.
;Bit 8 -> Indicates whether XON/XOFF flow control is used during transmission. If this member is TRUE,
; transmission stops when the XoffChar character is received And starts again when the XonChar character is received.
;Bit 9 -> Indicates whether XON/XOFF flow control is used during reception.
; If this member is TRUE, the XoffChar character is sent when the input buffer
; comes within XoffLim bytes of being full, And the XonChar character is sent
; when the input buffer comes within XonLim bytes of being empty.
;Bit 10 -> Indicates whether bytes received with parity errors are replaced with the character specified by the ErrorChar member.
; If this member is TRUE And the fParity member is TRUE, replacement occurs.
;Bit 11 -> If this member is TRUE, null bytes are discarded when received.
;Bit 12-13 -> 00 = Disables the RTS line when the device is opened and leaves it disabled.
; 01 = Enables the RTS line when the device is opened and leaves it on.
; 10 = Enables RTS handshaking. The driver raises the RTS line when the "type-ahead" (input) buffer is less than
; one-half full And lowers the RTS line when the buffer is more than
; three-quarters full. If handshaking is enabled, it is an error
; for the application To adjust the line by using the EscapeCommFunction function.
; 11 = Specifies that the RTS line will be high if bytes are available for transmission.
; After all buffered bytes have been sent, the RTS line will be low.
; !!Windows Me/98/95: This value is not supported.!!
;Bit 14 -> If this member is TRUE, the driver terminates all read and write operations with an error status if an error occurs.
; The driver will not accept any further communications operations
; Until the application has acknowledged the error by calling the ClearCommError function.
;Bit 15-31 -> Reserved; do not use.
If flags = 0
;Normal Flags
;Bit 0 BINARY MODE
;Bit 1 PARITY CHECK
;Bit 7 TXContinueOnXoff
;Bit 12 RTS_CONTROL_ENABLE
flags = $1083
EndIf
PortConfig\BaudRate = baud
PortConfig\Parity = Parity
PortConfig\StopBits = StopBits
PortConfig\ByteSize = ByteSize
PortConfig\fBits = flags
SetCommState_(*FileID, @PortConfig)
PurgeComm_(*FileID, #PURGE_TXCLEAR | #PURGE_RXCLEAR)
EndIf
EndIf
ProcedureReturn *FileID
EndProcedure
Procedure Close_Com(com.l)
CloseFile(com)
EndProcedure
OpenConsole()
If Open_Com(1, 4800, 1024, 1024, #EVENPARITY, 7, #ONESTOPBIT, $2018, 50)
WriteByte(5) ;<- This should be Strg+E ... Play with it...
Repeat
Delay(1000)
a$ = ReadString()
If a$
PrintN(a$)
Input()
ElseIf Left(Inkey(), 1) = Chr(27)
Break
EndIf
Until a$
Close_Com(1)
Else
PrintN("Error!, Can't open Com1")
Input()
EndIf
CloseConsole()
End
{Home}.:|:.{Codes}.:|:.{Downloads}.:|:.{History Viewer Online}.:|:.{Bier spendieren}
Was wird denn im Hyperterminal für ein Zeichen gesendet, wenn Du STRG + E drückst? Muss ja irgend einen ASCII-Wert haben. Zur Not Nullmodem Kabel (TxD out an RxD in) zwischen zwei Schnittstellen des Rechners, an eine Hyperterminal, an eine Brays Terminal, das zeigt Dir dann den Hex-Wert des Zeichens.
Wenn Du den hast, kannst Du den auch über MVCOM aus PureBasic senden. Zum Empfangen baust Du eine Schleife:
Wenn Du den hast, kannst Du den auch über MVCOM aus PureBasic senden. Zum Empfangen baust Du eine Schleife:
Code: Alles auswählen
zrxd.s = " " ;Lesebuffer mit einem Zeichen initialisieren
Repeat
If hcom > 0
While ComInputBufferCount(hcom) > 0
If ComInput(hcom, zrxd) ;Read String
Debug zrxd
EndIf
Wend
EndIf
Delay(20) ;nicht vergessen, sonst wird das System lahmgelegt
Until WindowEvent() = #PB_CloseWindow oder so
So, ich versuchs nochmal.
Also mit dem Hyperterminal funzt alles ! Ich drücke STRG+E und erhalte SOFORT eine antwort.
Der Code :
scheint zu funktionieren. Also es wird geöffnet und gesendet, aber wo wird von der Waage die Antwort abgelegt ?? Mit einem Speziellen Programm kann man das "abhören " ! Sieht dann so aus :

Kann jemand daraus erkennen wo die Antwort der Waage ist ??
Also mit dem Hyperterminal funzt alles ! Ich drücke STRG+E und erhalte SOFORT eine antwort.
Der Code :
Code: Alles auswählen
Procedure.l Open_Com(com.l, baud.l, Buffer_in.l, Buffer_out.l, Parity.l, ByteSize.l, StopBits.l, flags.l, TimeOUT.l)
*FileID = CreateFile(com, "COM" + Str(com) + ":")
If *FileID
If GetCommState_(*FileID, @PortConfig.DCB)
SetupComm_(*FileID, Buffer_in, Buffer_out)
TimeOut_Const.l = 1
ct.COMMTIMEOUTS
ct\ReadIntervalTimeout = #MAXDWORD
ct\ReadTotalTimeoutMultiplier = TimeOUT
ct\ReadTotalTimeoutConstant = TimeOut_Const
ct\WriteTotalTimeoutMultiplier = TimeOUT
ct\WriteTotalTimeoutConstant = TimeOut_Const
SetCommTimeouts_(*FileID, ct)
If flags = 0
flags = $1083
EndIf
PortConfig\BaudRate = baud
PortConfig\Parity = Parity
PortConfig\StopBits = StopBits
PortConfig\ByteSize = ByteSize
PortConfig\fBits = flags
SetCommState_(*FileID, @PortConfig)
PurgeComm_(*FileID, #PURGE_TXCLEAR | #PURGE_RXCLEAR)
EndIf
EndIf
ProcedureReturn *FileID
EndProcedure
Procedure Close_Com(com.l)
CloseFile(com)
EndProcedure
OpenConsole()
If Open_Com(3, 4800, 1024, 1024, #EVENPARITY, 7, #ONESTOPBIT, $2018, 50)
PrintN("Geöffnet !")
WriteStringN(Hex(5)) ;<- This should be Strg+E ... Play with it...
zahl=0
Repeat
a$ = ReadString()
PrintN(a$)
Delay(500)
zahl+1
Until zahl=1000
Close_Com(1)
Else
PrintN("Error!, Can't open Com3")
Input()
EndIf
CloseConsole()
End
scheint zu funktionieren. Also es wird geöffnet und gesendet, aber wo wird von der Waage die Antwort abgelegt ?? Mit einem Speziellen Programm kann man das "abhören " ! Sieht dann so aus :

Kann jemand daraus erkennen wo die Antwort der Waage ist ??
PB 6.10LTs / Windows 11 64Bit (i9/32GB/ 1TB-SSD+4TB-HDD/3060GTX12GB) / 2x27" Multitouch
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !
... ich mache dazu keine Aussage, weil ich mich damit selbst belasten könnte !