Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   SMS Senden über AT-Kommandos (https://www.delphipraxis.net/95909-sms-senden-ueber-kommandos.html)

Gehstock 15. Jul 2007 22:24


SMS Senden über AT-Kommandos
 
arbeite wieder mal an meinen AT Commander projekt (Handyverwaltung über AT Kommandos) und hab Probleme beim senden von SMS

Delphi-Quellcode:
procedure TForm1.SendSMSClick(Sender: TObject);
begin
s := 'AT+CMGS=' + inttostr(Length(Edit8.Text) div 2-1); //PDU Länge senden
SendCMD2;
Memo5.Lines.Add(Result1);
s := Edit8.Text+ #$1A; // enthält PDU
SendCMD2;
Memo5.Lines.Add(Result1);
end;
Das Log vom PortMon sieht so aus
Zitat:

Mein Programm
194 0.00100404 ATcommander.exe IRP_MJ_WRITE Serial2 SUCCESS Length 12: AT+CMGS=26..
195 0.07969588 ATcommander.exe IRP_MJ_READ Serial2 TIMEOUT Length 4: ..>
196 0.00077887 ATcommander.exe IRP_MJ_WRITE Serial2 SUCCESS Length 57: 0001000B911027436739F900000ED4F29C0EA296E77410B53C A703...
197 4.07700755 ATcommander.exe IRP_MJ_READ Serial2 TIMEOUT Length 20: ..+CMGS: 218....OK..


Funktionierendes Programm
179 0.00072216 PDUspy.exe IRP_MJ_WRITE Serial2 SUCCESS Length 11: at+cmgs=26.
182 0.00000335 PDUspy.exe IRP_MJ_READ Serial2 SUCCESS Length 4: ..>
187 0.00112249 PDUspy.exe IRP_MJ_WRITE Serial2 SUCCESS Length 55: 0001000B811027436739F900000ED4F29C0EA296E77410B53C A703.
253 0.00000335 PDUspy.exe IRP_MJ_READ Serial2 SUCCESS Length 20: ..+CMGS: 215....OK..

Hab da TimeOuts aber alle anderen sachen am Gerät kann ich fehlerfrei Lesen und Schreiben


Ankommen tut aber nix


Comport

Delphi-Quellcode:
function TForm1.SetupCOMPort: Boolean;
const RxBufferSize = 8192;
  TxBufferSize = 8192;
var DCB: TDCB;
  Config: string;
  CommTimeouts: TCommTimeouts;
begin
  Result := True;
  if not SetupComm(ComFile, RxBufferSize, TxBufferSize) then
    Result := False;
  if not GetCommState(ComFile, DCB) then
    Result := False;

  Config := 'baud=' + (iComBaud) + ' parity=n data=8 stop=1';
  if not BuildCommDCB(@Config[1], DCB) then
    Result := False;
  if not SetCommState(ComFile, DCB) then
    Result := False;
  with CommTimeouts do
    begin
    PurgeCom(PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
      ReadIntervalTimeout := 20;
      ReadTotalTimeoutMultiplier := 1;
      ReadTotalTimeoutConstant := 200;
      WriteTotalTimeoutMultiplier := 0;
      WriteTotalTimeoutConstant := 0;
      {ReadIntervalTimeout := 15;
      ReadTotalTimeoutMultiplier := 0;
      ReadTotalTimeoutConstant := 1000;
      WriteTotalTimeoutMultiplier := 0;
      WriteTotalTimeoutConstant := 1000; }
       end;

  if not SetCommTimeouts(ComFile, CommTimeouts) then Result := False;
  PurgeCom(PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
end;

function TForm1.PurgeCom(mode:Dword): boolean; //function
begin
 result := PurgeComm(ComFile,mode);
end;

Portmon Log

Zitat:


Fremdanwendung


56 0.05360402 PDUspy.exe IOCTL_SERIAL_SET_BAUD_RATE Serial2 SUCCESS Rate: 115200
57 0.00276711 PDUspy.exe IOCTL_SERIAL_CLR_RTS Serial2 SUCCESS
58 0.00295568 PDUspy.exe IOCTL_SERIAL_SET_DTR Serial2 SUCCESS
59 0.00000196 PDUspy.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial2 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
60 0.00000168 PDUspy.exe IOCTL_SERIAL_SET_CHAR Serial2 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
61 0.02095518 PDUspy.exe IOCTL_SERIAL_SET_HANDFLOW Serial2 SUCCESS Shake:1 Replace:0 XonLimit:2048 XoffLimit:2048
62 0.00000447 PDUspy.exe IOCTL_SERIAL_PURGE Serial2 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
63 0.00000475 PDUspy.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial2 SUCCESS InSize: 8192 OutSize: 8192
64 0.00000140 PDUspy.exe IOCTL_SERIAL_SET_TIMEOUTS Serial2 SUCCESS RI:-1 RM:0 RC:0 WM:0 WC:0
67 0.00000279 PDUspy.exe IOCTL_SERIAL_PURGE Serial2 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR




Meine

146 0.00000670 ATcommander.exe IOCTL_SERIAL_SET_QUEUE_SIZE Serial2 SUCCESS InSize: 8192 OutSize: 8192
147 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_BAUD_RATE Serial2 SUCCESS
148 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial2 SUCCESS
149 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_CHARS Serial2 SUCCESS
150 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_HANDFLOW Serial2 SUCCESS
151 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_BAUD_RATE Serial2 SUCCESS
152 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_LINE_CONTROL Serial2 SUCCESS
153 0.00000140 ATcommander.exe IOCTL_SERIAL_GET_CHARS Serial2 SUCCESS
154 0.00000112 ATcommander.exe IOCTL_SERIAL_GET_HANDFLOW Serial2 SUCCESS
155 0.05347635 ATcommander.exe IOCTL_SERIAL_SET_BAUD_RATE Serial2 SUCCESS Rate: 115200
156 0.00339345 ATcommander.exe IOCTL_SERIAL_SET_RTS Serial2 SUCCESS
157 0.00219693 ATcommander.exe IOCTL_SERIAL_SET_DTR Serial2 SUCCESS
158 0.00000168 ATcommander.exe IOCTL_SERIAL_SET_LINE_CONTROL Serial2 SUCCESS StopBits: 1 Parity: NONE WordLength: 8
159 0.00000251 ATcommander.exe IOCTL_SERIAL_SET_CHAR Serial2 SUCCESS EOF:0 ERR:0 BRK:0 EVT:0 XON:11 XOFF:13
160 0.00695591 ATcommander.exe IOCTL_SERIAL_SET_HANDFLOW Serial2 SUCCESS Shake:1 Replace:40 XonLimit:4096 XoffLimit:1024
161 0.00000307 ATcommander.exe IOCTL_SERIAL_PURGE Serial2 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR
162 0.00000140 ATcommander.exe IOCTL_SERIAL_SET_TIMEOUTS Serial2 SUCCESS RI:20 RM:1 RC:200 WM:0 WC:0
163 0.00000112 ATcommander.exe IOCTL_SERIAL_PURGE Serial2 SUCCESS Purge: TXABORT RXABORT TXCLEAR RXCLEAR

SirTwist 15. Jul 2007 23:43

Re: SMS Senden über AT-Kommandos
 
Zitat:

Mein Programm
0 0.00078641 ATcommander.exe IRP_MJ_WRITE Serial2 SUCCESS Length 12: AT+CMGS=26..
1 0.99982903 ATcommander.exe IRP_MJ_READ Serial2 TIMEOUT Length 4: ..>
2 0.00053443 ATcommander.exe IRP_MJ_WRITE Serial2 SUCCESS Length 57: 0001000B911027436739F900000ED4F29C0EA296E77410B53C A703...
3 1.00001425 ATcommander.exe IRP_MJ_READ Serial2 TIMEOUT Length 0:


Funktionierendes Programm
179 0.00072216 PDUspy.exe IRP_MJ_WRITE Serial2 SUCCESS Length 11: at+cmgs=26.
182 0.00000335 PDUspy.exe IRP_MJ_READ Serial2 SUCCESS Length 4: ..>
187 0.00112249 PDUspy.exe IRP_MJ_WRITE Serial2 SUCCESS Length 55: 0001000B811027436739F900000ED4F29C0EA296E77410B53C A703.
253 0.00000335 PDUspy.exe IRP_MJ_READ Serial2 SUCCESS Length 20: ..+CMGS: 215....OK..

An der Stelle fällt mir auf, dass hinter Deinem AT-Befehl zwei Pünktchen sind, beim funktionierenden Programm aber nur ein Punkt. Genauso in der Zeile 2 versus Zeile 187. Sendest Du vielleicht CR+LF und das Mobiltelefon mag nur CR oder LF?

Gehstock 15. Jul 2007 23:53

Re: SMS Senden über AT-Kommandos
 
Cr LF? damit kann ich grad nix anfangen

Luckie 16. Jul 2007 00:42

Re: SMS Senden über AT-Kommandos
 
CR: Carriage Return -> Wagenrücklauf.
LF: Line Feed -> Zeilenvorschub.

Diese Ausdrücke kommen noch der Schreibmaschinentechnik. Um eine neue Zeile anzufangen, war es nötig den Wagen mit dem Papier an den Zeilenanfang zurückzufahren (Carriage return) und die Walze eine Zeile weiterzudrehen (Line feed). In der Computertechnik wurden daraus entsprechende Steuerzeichen. Allerdings Hand habt jedes Betriebssystem eine neue Zeile anders. Unter Windows ist ein CR und ein LF nötig. Unter Linux reicht ein LF und ein MAC OS nimmt ein CR, glaube ich. Deswegen ist es manchmal nötig Textdateien zu konvertieren, um die Zeilenumbrüche wieder herzustellen.
Diese Steuerzeichen werden auch bei manchen Protokollen zur Steuerumng von Hardware benutzt, um eine Befehlszeile abzuschliessen.

Du müsstest jetzt mal gucken, wie bei deinem Protokoll eine Befehlszeile angeschlossen werden muss.

Gehstock 16. Jul 2007 04:42

Re: SMS Senden über AT-Kommandos
 
Achso ihr meint
Delphi-Quellcode:
#13 #10
ist dabei aber auch ohne gehts net hatte ich schon versucht

Delphi-Quellcode:
Procedure TForm1.SENDcmd2;
var BytesWritten: DWORD;
  d: array[1..200] of Char;
  BytesRead: DWORD;
  i: Integer;
begin
  s := s + #13#10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil);
//  Result1 := '';
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
    begin
      StatusBar.Panels[0].text:='Nicht Verbunden';
        exit;
    end;
  s := '';
  for i := 1 to BytesRead do
    s := s+d[I];
  Result1 := s;
end;

Luckie 16. Jul 2007 04:55

Re: SMS Senden über AT-Kommandos
 
Nicht ohne. Entwerder CR und LF oder eben nur eins von beiden. Aber das sollte auch in den Protokoll-Spezifikationen stehen.

EDatabaseError 16. Jul 2007 05:42

Re: SMS Senden über AT-Kommandos
 
Also bei denen Modems die Ich bisver vertüddelt hab war es immer #13#10 (also beides)

Schau mal unter google: send sms with at commands ---> http://www.developershome.com/sms/ho...dSMSFromPC.asp

Da gibts ein relativ gutes Tutorial welches du unter HyperTerminal durchspielen kannst und es dann mit Delphi probieren kannst.

Und somit komm ich zu meiner 2. Frage:
Hast du deine Kommandos schon mal mit dem Hyperterminal eingetippt währent Portmon lief um nen direkten Vergleich zu haben? :stupid:

Mfg

Gehstock 16. Jul 2007 07:26

Re: SMS Senden über AT-Kommandos
 
nur eins verwenden bringt auch nix

mit dem Hyper Terminal komm ich gar nicht zurecht ich kann nicht einfach eintippen muss es reinkopieren dann dauert es ne halbe stunde bis ich da error stehen hab porteinstellungen nehme ich die selben

EDatabaseError 16. Jul 2007 12:19

Re: SMS Senden über AT-Kommandos
 
Probier mal den Code von mir und dann lad dir Docklight runter. Das ist ein 1A Spitzenklasse Terminalprogramm.

Mfg
Tobi

DP-Maintenance 17. Jul 2007 09:36

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Es geht primär um Delphi.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz