Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправка смс с помощью AT команд, как отправить ctrl+z в com-порт 
V
    Опции темы
MacTep
Дата 11.3.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Использую команду AT+CMGS для отправки смс с телефона, подключенного к компьютеру.
В конце этой команды нужно отправить com-порту Ctrl+Z, но как это сделать, не понимаю.
Исходник:

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    Edit1: TEdit;
    Button1: TButton;
    Memo1: TMemo;
    procedure CheckBox1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
  public
    function OpenCOMPort: Boolean;
    function SetupCOMPort: Boolean; //для настройки порта
    procedure Connect;
    procedure Disconnect;
  end;

var
  Form1: TForm1;
  ComFile: THandle; //Хэндл создаваемого нами файла
  ComString: string; //(COM1, COM2 или COM3)
  ComSpeed: Integer; //Скорость взаимодействия с COM-портом
  Status: Boolean; //подключен или не подключен (чтобы в дальнейшем проверять статус)

implementation

{$R *.dfm}

procedure TForm1.Connect;
begin
  ComString := 'COM8';
  ComSpeed := 19200;
  if OpenCOMPort = true then //Открываем порт…
    if SetupCOMPort = true then //…и конфигурируем его
      Memo1.Lines.Add('Подключились...');
  Sleep(1500); //засыпаем на полторы секунды чтобы дать время на соединение
end;

procedure TForm1.Disconnect;
begin
  CloseHandle(ComFile);
  Memo1.Lines.Add('Отключились.');
end;

function TForm1.OpenCOMPort: Boolean;
var DeviceName: array[0..80] of Char;
  Device: string;
begin 
  Device := ComString;
  StrPCopy(DeviceName, Device); 
  ComFile := CreateFile(DeviceName,
    GENERIC_READ or GENERIC_WRITE, 
    0,
    nil, 
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 
    0);
  if ComFile = INVALID_HANDLE_VALUE then
    begin
      Result := False; 
      Status := Result;
    end 
  else
    begin 
      Result := True;
      Status := Result;
    end;
end;

function TForm1.SetupCOMPort: Boolean;
const RxBufferSize = 256;
  TxBufferSize = 256;
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=' + IntToStr(ComSpeed) + ' 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
      ReadIntervalTimeout := 0;
      ReadTotalTimeoutMultiplier := 0;
      ReadTotalTimeoutConstant := 1000;
      WriteTotalTimeoutMultiplier := 0;
      WriteTotalTimeoutConstant := 1000;
    end;
  if not SetCommTimeouts(ComFile, CommTimeouts) then
    Result := False;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  if CheckBox1.Checked then
    Connect
  else 
    Disconnect;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if Status = true then //При выходе из программы отключаемся
    Disconnect; 
end;

procedure TForm1.Button1Click(Sender: TObject);
var BytesWritten: DWORD;
  s: string; 
  d: array[1..1500] of Char; 
  BytesRead: DWORD; 
  i: Integer; 
  Result: string; 
begin 
  s := Edit1.Text; //Берём команды из Edit1…
  s := s + #13 + #10;
  WriteFile(ComFile, s[1], Length(s), BytesWritten, nil); //…и посылаем их телефону
  Result := ''; 
  if not ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
    begin 
      MessageDlg('Ошибка чтения!', mtError, [mbOK], 0); 
        exit;
    end;
  s := '';
  for i := 1 to BytesRead do //Считываем ответ от телефона
    s := s + d[I]; 
  Result := s; 
  Memo1.Lines.Add(Result); //Выводим ответ от телефона в Memo
end;

end.


Как видно из кода, текст для отправки com-порту пишется в Edit1, и кнопкой отправляется. Ответ от com-порта выводится в memo.

Это сообщение отредактировал(а) MacTep - 11.3.2011, 14:27


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
Snowy
Дата 11.3.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Ctrl+Z - это символ #26
PM MAIL   Вверх
MacTep
Дата 14.3.2011, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1292
Регистрация: 4.8.2003
Где: г. Самара

Репутация: нет
Всего: 4



Попробовал передавать chr(26). Реально, помогло. Спасибо!


--------------------
(A)bort, (R)etry, (I)gnore = Haфиг, Heфиг, Пoфиг ... :)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.