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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отправить только 1 АТ команду, Что надо изменить 
:(
    Опции темы
Xamilion
Дата 7.2.2008, 02:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.1.2008
Где: Планета ЗЕМЛЯ

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



Проблема в следующем я скачал из интернета(уже не помню откуда) 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 АТ команды в порт?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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