Seite 1 von 4

Serielle Abfrage ohne zu wissen was dran ist ?!

Verfasst: 20.02.2006 14:03
von Then
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 !

Verfasst: 21.02.2006 10:14
von HeX0R
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.

Verfasst: 21.02.2006 16:48
von Sven
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

Verfasst: 22.02.2006 11:21
von Sylvia
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. :freak:

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

Verfasst: 22.02.2006 19:08
von Then
Also, ich war heute an dieser Waage dran und habe folgendes herausgefunden :

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

Verfasst: 22.02.2006 22:48
von Falko
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 :mrgreen:

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

Verfasst: 23.02.2006 01:51
von Then
leider kommt da nichts an... NbCar bleibt auf 0 ... :cry:

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

Verfasst: 23.02.2006 10:22
von HeX0R
Versuch mal das:
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

Verfasst: 25.02.2006 01:52
von Sven
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:

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

Verfasst: 15.03.2006 13:33
von Then
So, ich versuchs nochmal.

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 :

Bild

Kann jemand daraus erkennen wo die Antwort der Waage ist ??