Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2013, 09:35   #1
qZED
Пользователь
 
Регистрация: 13.05.2009
Сообщений: 26
По умолчанию Общие вопросы по TComport

Добрый день!
Код:
  ComPort.Open;
  if not ComPort.Connected then
    WriteLn('Ошибка порта');
Почему то ComPort.Connected всегда равен True. Как узнать что порт не открыли ?
Вообще я опять пытаюсь написать код для работы с модемом huawei E173.
Код:
program ModTest;
{$APPTYPE CONSOLE}

uses
  SysUtils, CPort, Windows, SyncObjs;

var
  ComPort: TComPort;
  Events: TComEvents;
  Answer, Data: string;
  Event: TEvent;

procedure HandleMessage(const sMsg : String);
begin
  //if not ((Pos('^RSSI', sMsg) > 0) or (Pos('^BOOT', sMsg) > 0)) then
  WriteLn('[Rx] ' + sMsg);

  if Pos('^RSSI', sMsg) > 0 then
  begin
      //^RSSI:12
  end
  else if pos('^ORIG', sMsg) = 1 then
  begin
    //HandleCVOICE(idGSMModule, sMsg);
  end
  else if Pos('+CUSD', sMsg) = 1 then
  begin
    //HandleCUSD(idGSMModule, sMsg);
  end
  else
  begin
     FReceived := (CompareText('OK', sMsg) = 0) or (CompareText('ERROR', sMsg) = 0) or (CompareText('COMMAND NOT SUPPORT', sMsg) = 0);
     if not FReceived then
     begin
       if FRxBuffer = '' then
        FRxBuffer := sMsg
      else
        FRxBuffer := FRxBuffer + #13#10 + sMsg;
     end;

  end;
end;

procedure ComPortOnRxChar(Buffer: String; Count: Integer);
var
  c: char;
  i: Integer;
begin
  // process received data
  for i := 1 to Length(Buffer) do
  begin
    c := Buffer[i];
    case c of
      #00:;
      #10:;
      #13:
        begin
          if Length(Trim(FMessageBuf)) > 0 then
          begin
            HandleMessage(FMessageBuf);
            FMessageBuf := '';
          end;
        end;
      else
      begin
        FMessageBuf := FMessageBuf + c;
      end;
    end;

    if (FMessageBuf = 'OK') and (FMessageBuf <> '') then
    begin
      HandleMessage(FMessageBuf);
      FMessageBuf := '';
    end;
  end;
end;

procedure TxAndWait(Data: string);
var
  FMSec: Cardinal;
begin
  FReceived := False;
  FMessageBuf := '';
  FRxBuffer := '';

  WriteLn('[Tx] ' + Data);
  ComPort.WriteStr(Data + #13#10); // send test command

  FMSec := 2000;
  FMSec := GetTickCount + FMSec;
  while (not FReceived) do
  begin
    Events := [evRxChar];
	  ComPort.WaitForEvent(Events, Event.Handle, 100);  // wait for charachters
  	if evRxChar in Events then
	  begin
      ComPort.ReadStr(Data, ComPort.InputCount);
      ComPortOnRxChar(Data, ComPort.InputCount);
  	end;
    if GetTickCount > FMSec then
    begin
      WriteLn('Timeout. AT Command:' + Data);
      Exit;
    end;
  end;
  if FReceived and (CompareText('ERROR', FMessageBuf) = 0) then
    WriteLn('AT Error. AT Command:' + Data);
end;

function IsEscKeyPressed : boolean;
begin
end;


begin
  InputConsoleHandle  := GetStdHandle(STD_INPUT_HANDLE);
  Event := TEvent.Create(nil, True, False, '');
  SetConsoleCtrlHandler(@CtrlHandler, True);
  try
    ComPort := TComPort.Create(nil);
    ComPort.Buffer.InputSize := 4096;
    ComPort.Buffer.OutputSize := 4096;
    ComPort.BaudRate := br115200;
    try
      if ParamCount > 0 then
        ComPort.Port := ParamStr(1)
      else
        ComPort.Port := 'COM11';
      ComPort.Events := [];
      ComPort.FlowControl.ControlDTR := dtrEnable;
      ComPort.FlowControl.ControlRTS := rtsEnable;
      WriteLn('Open COM port.');
      try
        ComPort.Open;
      except
        WriteLn('Error open com port');
      end;

      TxAndWait('AT+CMEE=1');
      TxAndWait('ATE0');
      TxAndWait('AT^DSFLOWRPT=0');
      TxAndWait('AT+CLCC');
      TxAndWait('AT+CLIP=1');
      TxAndWait('AT+CREG=1');
      TxAndWait('AT+CGREG=1');
      TxAndWait('AT+CSSN=1,1');
      TxAndWait('AT+CCWA=1');
      TxAndWait('AT+CNMI=2,1,2,2,0');
      TxAndWait('AT+CMGF=0');
      TxAndWait('AT+CPBS="SM"');
      TxAndWait('AT+CPBS?');

      while not IsEscKeyPressed do
      begin
        Events := [evRxChar];

        ComPort.WaitForEvent(Events, Event.Handle, 100);  // wait for charachters
        if evRxChar in Events then
        begin
          ComPort.ReadStr(Data, ComPort.InputCount);
          ComPortOnRxChar(Data, ComPort.InputCount);
        end;
        TxAndWait('AT');
        if FReceived then WriteLn('GOOD');
      end;
    finally
      FreeAndNil(ComPort);
    end;
  except
    on E: Exception do
      WriteLn('Error: ' + E.Message);
  end;
  Event.Free;
end.
Прошу дать указания по правильному программированию. Нужно слушать порт и реагировать на входящие команды, а также посылать команды модему. Во вложении весь код.
Вложения
Тип файла: txt ModTest.txt (5.9 Кб, 152 просмотров)

Последний раз редактировалось qZED; 07.12.2013 в 09:44. Причина: Добавление 2
qZED вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Общие вопросы .NET Templar() Общие вопросы .NET 3 16.11.2013 21:39
Общие вопросы. WizarD.89 Свободное общение 12 05.11.2012 18:08
АСКУЭ, общие вопросы difuzor Помощь студентам 18 27.09.2011 16:08
Общие вопросы по C# smartboy Общие вопросы .NET 1 17.07.2009 21:14
Общие вопросы по mysql pushok PHP 1 14.01.2008 22:57