Добрый день!
Код:
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.
Прошу дать указания по правильному программированию. Нужно слушать порт и реагировать на входящие команды, а также посылать команды модему. Во вложении весь код.