AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi An com port gesendete daten lesen
Thema durchsuchen
Ansicht
Themen-Optionen

An com port gesendete daten lesen

Ein Thema von schweindi · begonnen am 3. Mär 2010 · letzter Beitrag vom 7. Mär 2010
Antwort Antwort
Seite 4 von 5   « Erste     234 5      
LargoD

Registriert seit: 8. Jun 2007
42 Beiträge
 
#31

Re: An com port gesendete daten lesen

  Alt 6. Mär 2010, 14:35
Hast Du Dir mal angesehen, was TCOmBuffer für ein Typ ist? Das ist kein String!
Bitte benutze die entsprechenden Events und sieh Dir den übergebenen String an, notfalls mal einen Breakpoint in den Eventhandler setzen und dann einfach mit dem Mauszeiger auf den übergebenen String zeigen, und schon siehst Du, was angekommen ist.

Ich verstehe noch nicht, wieso Du einmal den String an das Modem (at<CR>) und dann die erwartete Antwort vom Modem (ok<CR><LF>) im selben Terminalfenster tippen kannst. Was du nach dem Tippen von ok<CR><LF> empfängst ist doch mMn die Antwort des Modems auf dieses (sinnlose) Kommando (ok<CR><LF>), oder?
Gruß
Erich
  Mit Zitat antworten Zitat
schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#32

Re: An com port gesendete daten lesen

  Alt 6. Mär 2010, 17:51
also... danke für den Hinweis jetzt seh ich der String ist: #0 hmm.. toll hätte "ok" sein sollen.
Das lesen von Paketen klappt also noch nicht so ganz.

Das mim Terminalfenster:
Folgende Prozedur:
1) In meinem Programm tippe ich bei Befehl senden: "at" ein (als wäre es ein gsm modem)
2) Im Modememulator (siehe screen) sehe ich, was angekommen ist und antworte, als wäre ich das Modem mit "ok"+#13
3) jetzt müsste in meinem Programm das Event (RxChar) ausgelöst werden, was es auch tut, leider ist der gelesene String: #0 und nicht "ok"

kennst du TComPort? Bzw die Komponente TComDataPacket? Da soll angeblich folgendes machen:
(Helpfile von TComPort)
"When application is connected to some sort of serial device like data loggers which constantly send data to PC, data is usually sent in packets. Packet is a string of charackters, usually of constant size, with some start and/or stop charackters. Application can parse incoming data inside OnRxChar event handler, but it's much easier to use TComDataPacket component, which does parsing process automatically.
...
When packet is formed OnPacket event is triggered with packet string as parameter. Any data that is discarded during the process of packet forming goes through OnDiscard event.
"

Also ich habe beim OnPacket event meinen Befehl reingeschrieben:

ShowMessage(str) //str = der string der ausgegeben wird von TComDataPacket

das muss doch so passen oder?
Miniaturansicht angehängter Grafiken
comemulator_145.jpg  
  Mit Zitat antworten Zitat
LargoD

Registriert seit: 8. Jun 2007
42 Beiträge
 
#33

Re: An com port gesendete daten lesen

  Alt 6. Mär 2010, 19:23
OK, das mit den zwei Terminal-Fenstern habe ich verstanden.

TComPort und auch TComDataPacket habe ich schon öfter in verschiedenen Projekten eingesetzt, hat immer gut geklappt.

Zeig doch mal aktuellen Code, vor Allem
die Initialisierung des Paket-objektes und den OnPacket Handler

Gruß
Erich
  Mit Zitat antworten Zitat
schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#34

Re: An com port gesendete daten lesen

  Alt 6. Mär 2010, 19:53
super, also hier mal eine kurze (!!) beschreibung:
hab 2 edits:
1) gibt den comport an ('com6' in meinem Fall)
2) gibt den Befehl an, den man ans modem senden will (nur mal als test ob alles funktioniert)

Buttons:
1) 'Test Connection' -> code:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var StartIni : TIniFile;
begin
ComPort1.Port:=Edit1.Text;
//Ini File
StartIni:=TIniFile.Create(ChangeFileExt(Application.ExeName,'.INI'));
try
StartIni.writeString('Com','Name',Edit1.Text);
finally
  StartIni.Free;
end;
ComPort1.Open;
end;
2) Disconnect (Testzweck) beinhaltet nur Comport1.Close;
3) Write -> sendet das was in Edit2.Text steht an den Port -> code:

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var Str: String;
begin
//write to port
Str := Edit2.Text;
//ComPort1.WriteStr(Str); // string type variable
ComPort1.Write(Str[1], Length(Str)); // no defined type
ComPort1.TransmitChar(#13);
ShowMessage('Write Data Successfull');
//answer
//read_answer; //das war mein Alternativversuch, wird nicht verwendet
//answer with datapacket
ComDataPacket1.StartString:=#10; //hier angegeben, da es per Optionsmenu als '#13' angegeben wird (alter fehler)
ComDataPacket1.StopString:=#13;
end;
so und jetzt noch die komponenten:
1) TComPort ('ComPort1'):

Delphi-Quellcode:
object ComPort1: TComPort
    BaudRate = br9600
    Port = 'COM6'
    Parity.Bits = prNone
    StopBits = sbOneStopBit
    DataBits = dbEight
    EventChar = #10
    Events = [evRxChar, evTxEmpty, evRxFlag, evRing, evBreak, evCTS, evDSR, evError, evRLSD, evRx80Full]
    Buffer.InputSize = 4096
    Buffer.OutputSize = 4096
    FlowControl.OutCTSFlow = True
    FlowControl.OutDSRFlow = False
    FlowControl.ControlDTR = dtrDisable
    FlowControl.ControlRTS = rtsHandshake
    FlowControl.XonXoffOut = False
    FlowControl.XonXoffIn = False
    Timeouts.ReadInterval = 20
    Timeouts.ReadTotalMultiplier = 100
    Timeouts.ReadTotalConstant = 10000
    Timeouts.WriteTotalMultiplier = 2
    Timeouts.WriteTotalConstant = 10000
    OnError = ComPort1Error
    Left = 8
    Top = 200
  end
2) TComDataPacket -> code:

Delphi-Quellcode:
  object ComDataPacket1: TComDataPacket
    ComPort = ComPort1
    OnPacket = ComDataPacket1Packet
    Left = 48
    Top = 200
  end
und zuletzt noch: OnPacket ->

Delphi-Quellcode:
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
begin
ShowMessage('Packet RX: '+IntToStr(length(str)));
ShowMessage(str);
end;
so das wäre alles... hoffe es hilft dir weiter
  Mit Zitat antworten Zitat
LargoD

Registriert seit: 8. Jun 2007
42 Beiträge
 
#35

Re: An com port gesendete daten lesen

  Alt 6. Mär 2010, 21:33
Also nur mal so auf die Schnelle drübergesehen:

StartString := #10 ist falsch, wieso sollte das Modem vor der Antwort Linefeed senden?
StopString := #13+#10 sollte passen, denn normalerweise senden Modems nach der Antwort CR/LF, wenn sie nicht umkonfiguriert sind.
Ich hofft Du weißt, wie man CR/LF auf der Tastatur (zum Testen) sendet.

Also zum Senden:
ComDataPacket1.StartString:=''; // das sollte eigentlich nur einmal gemacht werden, ist aber egal
ComDataPacket1.StopString:=#13+#10; // das sollte eigentlich nur einmal gemacht werden, ist aber egal
ComPort1.WriteStr(Edit2.Text+#13)

Timeouts brauchst Du zum Testen erst mal keine, solange Du nur das abholst was auch wirklich im Puffer ist.
Außerdem kannst Du nicht schnell genug tippen

Kein Eventchar, also
EventChar :=#0;

Vielleicht habe ich jetzt noch was übersehen, aber bau das erst mal um und teste es.

Noch ein Tip: Zur Auswahl des ComPorts sieh Dir mal TComCombobox an.

Gruß
Erich
  Mit Zitat antworten Zitat
schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#36

Re: An com port gesendete daten lesen

  Alt 6. Mär 2010, 23:57
okay danke

habe das mal geändert und ja, wenn ich einfach ok+(enter) eingebe dann kommt die MsgBox mit der länge des strings und der erste buchstabe "o" wird ausgegeben... wenn ich es nochmal mache, ist die zeichenkette nur noch leer... also ja immer den ersten buchstaben kann er ausgeben.

Danach sollte an den Buffer clearen oder? naja egal - ich will mal, dass er das ganze packet liest
  Mit Zitat antworten Zitat
LargoD

Registriert seit: 8. Jun 2007
42 Beiträge
 
#37

Re: An com port gesendete daten lesen

  Alt 7. Mär 2010, 07:12
Zitat:
habe das mal geändert und ja, wenn ich einfach ok+(enter) eingebe dann kommt die MsgBox mit der länge des strings...
Wenn Du den Stop-String richtig eingegeben hast, sollte die Message Box erst aufgehen, wenn Du ok#13 und danach #10 gedrückt hast.
Vier Zeichen 'o', 'k', #13 und dann #10!
Hast Du die Timeouts wirklich abgestellt?
Ist Size wirklich 0?
Und setze mal FlowControl auf None.

Zitat:
Danach sollte an den Buffer clearen oder?
Nein, was das PacketEvent Dir geliefert hat, ist aus dem Puffer verschunden.

Gruß
Erich
  Mit Zitat antworten Zitat
schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#38

Re: An com port gesendete daten lesen

  Alt 7. Mär 2010, 11:23
1) In den ComPort Options sind alle timeouts auf 0
2) Size = 0
3) FlowContorl = None

Wenn ich enter drücke kommt die msgbox - dh enter + #10#13, ich kann auch alt+010 bzw alt+013 eingeben, es kommt auch das fenster.
Wenn ich "ok"+#10#13 im terminal schreibe, Steht im Programm: "Input: o" beim nächsten mal, wenn ich etwas eintippe + enter nur "Input:" dh nur der erste buchstabe wird gelesen...

Das sagt mein Virtual Com log:
Port is opened
Application has set ByteSize to 5.
Application has set ByteSize to 8.
Application has set XonLim to 2048.
Application has set XoffLim to 512.
Application has set XoffChar to 13.
Application has set XonLim to 1024.
Application has set XoffLim to 1024.
Application has written 3 bytes.
Port is closed

vllt hilft das auch weiter...
  Mit Zitat antworten Zitat
schweindi

Registriert seit: 4. Feb 2010
60 Beiträge
 
#39

Re: An com port gesendete daten lesen

  Alt 7. Mär 2010, 12:24
okay.. das tut mir jetzt echt leid und ist mir wirklich peinlich

Ich habe das Programm jetzt mal direkt auf dem Server mit der SMS Software ausprobiert und siehe da:

Code:
549   13:13:38   Pcom_bridge.exe   IRP_MJ_CREATE         USBSER000   SUCCESS   Options: Open    
550   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_QUEUE_SIZE      USBSER000   SUCCESS   InSize: 4096 OutSize: 4096   
551   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS      
552   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS      
553   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_CHARS      USBSER000   SUCCESS      
554   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_HANDFLOW      USBSER000   SUCCESS      
555   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS   Rate: 9600   
556   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_CLR_RTS      USBSER000   SUCCESS      
557   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_CLR_DTR      USBSER000   SUCCESS      
558   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS   StopBits: 1 Parity: NONE WordLength: 8   
559   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_CHAR      USBSER000   SUCCESS   EOF:80 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13   
560   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_HANDFLOW      USBSER000   SUCCESS   Shake:0 Replace:0 XonLimit:1024 XoffLimit:1024   
561   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_TIMEOUTS      USBSER000   SUCCESS   RI:0 RM:0 RC:0 WM:0 WC:0   
562   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_SET_WAIT_MASK      USBSER000   SUCCESS   Mask: RXCHAR RXFLAG TXEMPTY CTS DSR RLSD BRK ERR RING RX80FULL    
563   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_MODEMSTATUS   USBSER000   SUCCESS      
564   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_MODEMSTATUS   USBSER000   SUCCESS      
565   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_GET_MODEMSTATUS   USBSER000   SUCCESS      
566   13:13:38   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
567   13:14:01   Pcom_bridge.exe   IRP_MJ_WRITE                  USBSER000   SUCCESS   Length 3: at.   
568   13:14:01   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
569   13:14:01   Pcom_bridge.exe   IOCTL_SERIAL_GET_COMMSTATUS      USBSER000   SUCCESS      
570   13:14:01   Pcom_bridge.exe   IRP_MJ_READ                  USBSER000   SUCCESS   Length 6: ..OK..   
571   13:14:01   Pcom_bridge.exe   IOCTL_SERIAL_GET_COMMSTATUS      USBSER000   SUCCESS      
572   13:14:01   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
573   13:14:23   Pcom_bridge.exe   IRP_MJ_WRITE                  USBSER000   SUCCESS   Length 9: at+cpin?.   
574   13:14:23   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
575   13:14:23   Pcom_bridge.exe   IOCTL_SERIAL_GET_COMMSTATUS      USBSER000   SUCCESS      
576   13:14:23   Pcom_bridge.exe   IRP_MJ_READ                  USBSER000   SUCCESS   Length 22: ..+CPIN: READY....OK..   
577   13:14:23   Pcom_bridge.exe   IOCTL_SERIAL_GET_COMMSTATUS      USBSER000   SUCCESS      
578   13:14:23   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
579   13:14:34   Pcom_bridge.exe   IRP_MJ_WRITE                 USBSER000   SUCCESS   Length 9: at+cfun?.   
580   13:14:34   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
581   13:14:34   Pcom_bridge.exe   IOCTL_SERIAL_GET_COMMSTATUS      USBSER000   SUCCESS      
582   13:14:34   Pcom_bridge.exe   IRP_MJ_READ                  USBSER000   SUCCESS   Length 18: ..+CFUN: 1....OK..   
583   13:14:34   Pcom_bridge.exe   IOCTL_SERIAL_GET_COMMSTATUS      USBSER000   SUCCESS      
584   13:14:34   Pcom_bridge.exe   IOCTL_SERIAL_WAIT_ON_MASK      USBSER000   SUCCESS      
585   13:14:41   Pcom_bridge.exe   IOCTL_SERIAL_PURGE        USBSER000   SUCCESS   Purge: TXABORT RXABORT    
586   13:14:41   Pcom_bridge.exe   IOCTL_SERIAL_SET_WAIT_MASK      USBSER000   SUCCESS   Mask:    
587   13:14:41   Pcom_bridge.exe   IOCTL_SERIAL_PURGE       USBSER000   SUCCESS   Purge: TXCLEAR RXCLEAR   
588   13:14:41   Pcom_bridge.exe   IRP_MJ_CLEANUP                  USBSER000   SUCCESS      
589   13:14:41   Pcom_bridge.exe   IRP_MJ_CLOSE                  USBSER000   SUCCESS
also wie man hier sieht, geht der Befehl "at" und bekommt "Length 6: ..OK.." zurück... und at+cpin? geht auch usw... also das Problem war einfach mein dummes virtuelles Com Programm!
So jetzt muss ich mal die Antworten formatieren, damit man sich da auskennt... "+CPIN: Ready....OK..22" ist nicht ganz die Antwort die ich brauche
  Mit Zitat antworten Zitat
LargoD

Registriert seit: 8. Jun 2007
42 Beiträge
 
#40

Re: An com port gesendete daten lesen

  Alt 7. Mär 2010, 13:21
Ja, da scheint Dein virtuelles Com-Port Programm einiges selbständig zu tun, z. B. Enter in CR/LF umzuwandeln. Nach dem Log habe ich den Eindruck, dass es auch versucht, ein Xon/Xoff Software-Protokoll zu fahren. Du kannst ja nochmal in die Einstellungen reinsehen, ob man da was ändern kann. Ist aber nicht mehr wichtig, wenn Du mit dem echten Modem weiter testen kannst.
Gruß
Erich
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 5   « Erste     234 5      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz