Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Система, Windows API > Отправка СМС с GSM модема с помощью AT команд


Автор: dreyqq 22.02.18, 07:34
Был у меня старый код
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    uses
    windows, ...
     
    procedure SendSMS(AComPort: integer; AMsg: String; ANumTel: String);
    var
      hFile: THandle;
     
      procedure WriteStr(AStr: String); //пишет в порт переданную строку
      var
        LWrited: Cardinal;
      begin
        //Пишем в порт
        WriteFile(hFile, PAnsiChar(AStr)^, Length(AStr), LWrited, nil);
      end;
     
    begin
      //открываем порт
      hFile := Windows.CreateFile(PChar({}'\\.\COM' + IntToStr(AComPort)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
     
      //если открылся
      if (hFile <> INVALID_HANDLE_VALUE) then
      begin
        try
          //устанавливаем текстовый режим
          WriteStr('AT+CMGF=1' + #$D#$A);
          //вводим номер в формате "+79xxxxxxxxx"
          WriteStr('AT+CMGS="'+ANumTel+'"' + #$D#$A);
          //вводим текст сообщения, только латиница
          WriteStr(AMsg + #$D#$A#$1A);
        finally
          //закрываем порт
          Windows.CloseHandle(hFile);
        end;
      end;// else showmessage('NOT OPEN');
    end;

На Delphi 7 работает идеально, но при переходе на Delphi XE5 перестал.
Особенностью данного кода есть то, что если в AMsg будет хоть один символ НЕ ЛАТИНИЦЕЙ, то смс не отправляется.
До чего докопал:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      //открываем порт
      hFile := Windows.CreateFile(PChar({}'\\.\COM' + IntToStr(AComPort)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);

В (windows.createfile), делфи7 при создании файла, он как я понял, идёт ANSI, а XE уже в кодировке WIDE. Пробовал и перебивать текст команд в ANSI из UTF8, и создал под делфи7 SMS.dll c этой процедурой... всё равно. даже dll работает только из delphi7, а на delphi XE не хочет

Пробовал обрезать переход на новую строку TRIM, но всё равно...

Отправляю вот так
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    sendsms(4, 'aaa', '+3809хххххххх');

Подскажите пожалуйста как заставить этот код работать под XE

Автор: Fr0sT 22.02.18, 11:28
Цитата dreyqq @
WriteFile(hFile, PAnsiChar(AStr)^, Length(AStr), LWrited, nil);

WriteFile(hFile, PAnsiChar(AnsiString(AStr))^, Length(AStr), LWrited, nil);

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)