Проблема в следующем я скачал из интернета(уже не помню откуда) Unit который позволяет конектиться и отправлять в ком порт АТ команды вот он Код | unit Unit2;
interface
uses Windows, Classes;
const Serial_OK = 0; Serial_NotOpen = -1; Serial_NotClose = -2; Serial_NoDataToRead = -3; Serial_NoDataToWrite = -4; Serial_ReadError = -5; Serial_WriteError = -6; Serial_Uknown = -$0F;
type TSerialPortParam=record //Win32 consts BaudRate: LongWord; ByteSize, Parity, StopBits, fDtrDisable, fRtsDisable: Byte; end; PSerialPortParam=^TSerialPortParam;
TSerialPort = class //Класс, описівающий порт private fPortNo: Byte; fPortHandle: THANDLE; fParam: TSerialPortParam; fError: Integer; fIsOpen: Boolean;
function Open(APortNo:BYTE):Integer; function Close:Integer;
procedure SetIsOpen(AIsOpen:Boolean);
procedure SetNo(ANo:Byte);
procedure SetParam(AParam: PSerialPortParam); function GetParam:PSerialPortParam; public constructor Create; //Создаёт класс не открывая порт, настройки по умолчанию... destructor Free; //Удаляет класс
property IsOpen : Boolean //True => открыть и наоборот read fIsOpen write SetIsOpen;
property No : Byte //Номер порта read fPortNo write SetNo;
property Param : PSerialPortParam //Параметры read GetParam write SetParam;
property Error : Integer //Код ошибки read fError;
//Записать OutCount байт из OutBuffer; //Возврат: Количество прочитанных байт в InBuffer function SendCommand( const OutBuffer:PChar; const OutCount:LongWord; const InBuffer:PChar; const WaitTime:LongWord):LongWord;
// procedure ClearBuffer; end;
const SP_DefaultNo = 1; SP_DefaultParam:TSerialPortParam = ( BaudRate:CBR_9600; ByteSize:8; Parity:NOPARITY; StopBits:ONESTOPBIT; );
procedure SP_CopyParam(Source, Dest : PSerialPortParam);
implementation
uses SysUtils, Unit1, Unit3;
// TSerialPort ********************************** constructor TSerialPort.Create;begin SP_CopyParam(@SP_DefaultParam, @fParam); fPortNo := SP_DefaultNo; fIsOpen := false; fError := Serial_OK; end;
destructor TSerialPort.Free;begin EscapeCommFunction(fPortHandle, CLRDTR); EscapeCommFunction(fPortHandle, CLRRTS); IsOpen := false; end;
function TSerialPort.Open; var A:COMMTIMEOUTS; begin fPortNo := APortNo; fPortHandle := CreateFile( PChar('COM'+IntToStr(fPortNo)), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
if( fPortHandle = INVALID_HANDLE_VALUE ) then fError := Serial_NotOpen else begin fIsOpen := true; Param := @fParam; GetCommTimeouts(fPortHandle, A); A.ReadIntervalTimeout := MAXDWORD; A.ReadTotalTimeoutMultiplier := MAXDWORD; A.ReadTotalTimeoutConstant := 5; SetCommTimeouts(fPortHandle, A); fError := Serial_OK; end; Result:=fError; end;
function TSerialPort.Close;
begin if( not CloseHandle(fPortHandle) ) then fError := Serial_NotClose else begin fIsOpen := false; fError := Serial_OK; end; Result:=fError; end;
procedure TSerialPort.SetIsOpen;begin if( not(AIsOpen = fIsOpen) ) then begin if( AIsOpen = true ) then Open(fPortNo) else Close; end; end;
procedure TSerialPort.SetNo;begin if( IsOpen ) then begin IsOpen := false; fPortNo := ANo; IsOpen := true; end else fPortNo := ANo; end;
procedure TSerialPort.SetParam; var fPortDCB:DCB; begin SP_CopyParam(AParam, @fParam); if( IsOpen ) then begin GetCommState(fPortHandle, fPortDCB); fPortDCB.BaudRate := AParam.BaudRate; fPortDCB.ByteSize := AParam.ByteSize; fPortDCB.Parity := AParam.Parity; fPortDCB.StopBits := AParam.StopBits; SetCommState(fPortHandle, fPortDCB); EscapeCommFunction(fPortHandle, SETDTR); EscapeCommFunction(fPortHandle, SETRTS); fError := Serial_OK; end else fError := Serial_NotOpen; end;
function TSerialPort.GetParam; var fPortDCB:DCB; begin if( IsOpen ) then begin GetCommState(fPortHandle, fPortDCB); fParam.BaudRate := fPortDCB.BaudRate; fParam.ByteSize := fPortDCB.ByteSize; fParam.Parity := fPortDCB.Parity; fParam.StopBits := fPortDCB.StopBits; fError := Serial_OK; end else fError := Serial_NotOpen; Result:=@fParam; end;
function TSerialPort.SendCommand; var RecLen,i : LongWord; Err, WaitT :Integer; c:Char; begin RecLen:=0; c:=#0; Err:=Serial_Uknown;
if( IsOpen ) then begin SetCommMask ( fPortHandle, EV_DSR OR EV_RXCHAR); If OutCount<>0 then Repeat ReadFile( fPortHandle, c, 1, i, nil) Until i=0; if( WriteFile(fPortHandle, OutBuffer^, OutCount, i, nil) ) then begin WaitT:=Round(WaitTime/10); {if( WaitCommEvent(fPortHandle, i, nil) ) then} Repeat Sleep(10); ReadFile( fPortHandle, c, 1, i, nil); If i=0 then Inc(Err); Until (Err>WaitT) or (c<>#0); If c<>#0 then begin InBuffer[RecLen] := c; Inc(RecLen); {if( (i AND EV_RXCHAR) = EV_RXCHAR ) then} Err := 0; repeat ReadFile( fPortHandle, c, 1, i, nil); if (i > 0) then begin InBuffer[RecLen] := c; Inc(RecLen); end else begin Inc(Err); end; until( Err > 20 ); InBuffer[RecLen] := #0; Err:= RecLen; end; end else begin Err := Serial_NoDataToRead; //Serial_WriteError; end; end else begin Err := Serial_NotOpen; end;
Result:=Err; end;
// TSerialPortReadThread ************************
procedure SP_CopyParam;begin Dest.BaudRate := Source.BaudRate; Dest.ByteSize := Source.ByteSize; Dest.Parity := Source.Parity; Dest.StopBits := Source.StopBits; end;
end.
|
АТ команды посылаю таким образом Код | Form1.InBufLen:=Form1.SP.SendCommand('AT'#13,3, @InBuffer, 10);
|
InBuffer-ответ телефона Посмотрев в порт мониторе ответы телефона я понял что что АТ команда отправляеться 2 раза т.е. телефон сначала выкидывает в ответ 2 команду которую вводит UNIT а затем ответ из-за этого я не могу реализовать некоторые АТ команды т.к. телефон просто не понимает что от него хотят. Что надо изменить или сделать чтобы телефон перестал кидать по 2 АТ команды в порт?
|