Re: An com port gesendete daten lesen
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 |
Re: An com port gesendete daten lesen
Liste der Anhänge anzeigen (Anzahl: 1)
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? |
Re: An com port gesendete daten lesen
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 |
Re: An com port gesendete daten lesen
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:
2) Disconnect (Testzweck) beinhaltet nur Comport1.Close;
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; 3) Write -> sendet das was in Edit2.Text steht an den Port -> code:
Delphi-Quellcode:
so und jetzt noch die komponenten:
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; 1) TComPort ('ComPort1'):
Delphi-Quellcode:
2) TComDataPacket -> code:
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
Delphi-Quellcode:
und zuletzt noch: OnPacket ->
object ComDataPacket1: TComDataPacket
ComPort = ComPort1 OnPacket = ComDataPacket1Packet Left = 48 Top = 200 end
Delphi-Quellcode:
so das wäre alles... hoffe es hilft dir weiter :)
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: String);
begin ShowMessage('Packet RX: '+IntToStr(length(str))); ShowMessage(str); end; |
Re: An com port gesendete daten lesen
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 |
Re: An com port gesendete daten lesen
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 |
Re: An com port gesendete daten lesen
Zitat:
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:
Gruß Erich |
Re: An com port gesendete daten lesen
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... |
Re: An com port gesendete daten lesen
okay.. das tut mir jetzt echt leid und ist mir wirklich peinlich :-P
Ich habe das Programm jetzt mal direkt auf dem Server mit der SMS Software ausprobiert und siehe da:
Code:
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!
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 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 :) |
Re: An com port gesendete daten lesen
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 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