Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

проблема с com портом   Найти похожие ветки 

 
windkz ©   (2004-04-24 12:59) [0]

Можно ли при помощи API реализовать следующую программу?
Протокол обмена по последовательному каналу

Активизировать - 01Н + 4 байта номера *
После подачи команды прибор готов к выдаче веса через 20 мс
Принять данные с индикатора - 10Н; -9 байт индикатора -
Принять данные о пассивной клавише - 11Н; -1 байт клавиши      -
Сбросить пассивную клавишу - 19Н
Принять активную клавишу - 14Н; -1 байт клавиши      -
Выдать активную клавишу - 13Н + 1 байт клавиши *
Сбросить активную клавишу - 15Н    *
Выдать данные на индикатор - 12Н + 8 байт данных *
Перевести терминал в индикацию веса - 18Н    *
Произвести установку нуля     - 0DН    *
Принять 1-е слово состояния - 16Н; -1 байт  -
Принять 2-е слово состояния - 17Н; -1 байт  -
Сброс сети - 02Н

-  посылка в прибор,  - передача из прибора


 
GanibalLector ©   (2004-04-24 13:03) [1]

Можно конечно...
Ты только это хотел узнать???


 
windkz ©   (2004-04-24 13:40) [2]

Конечно нет.

Только пробую себя в Delphi.
Нужно написать обработку для устройства...
Пробовал способы о которых на сайте и вообще в сети.
В принципе вроде все доступно. Но у меня не работает.
Попробовал изменить взятый пример:
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button1: TButton;
   Label1: TLabel;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 bb,cc:boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
  pDCB:TDCB;
  Gostr:pchar;
  FHandle: Thandle;
  xb,xn:cardinal;
  yb,yn:cardinal;

begin
FHandle := CreateFile( "COM2",  GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
GetCommState(FHandle,pDCB);// - получаем текущее DCB.
pDCB.BaudRate:=CBR_9600;// - устанавливаем скорость работы.
pDCB.Parity:=NOPARITY;// - устанавливаем отсутствие проверки на четность
pDCB.ByteSize:=8;// - 8 бит в передаваемом байте.
pDCB.StopBits:=OneStopBit; //- одиночный стоп-бит.
SetCommState(FHandle,pDCB); //- ну теперь собственно прописываем исправленное DCB.

 Gostr:="0DH";
 yb:=3;
 yn:=3;
 cc:=WriteFile(FHandle,Gostr,yb,yn,nil);

 bb:=ReadFile(FHandle,xb,1,xn,nil);

 Label1.Caption:=Label1.Caption+inttostr(xb);

 CloseHandle(FHandle);
 //end;
end;

end.

*-*-*-*-*---*-*---*-*
В результате что при включенном устройстве. что при выключеном получаю xb=4207223. Как записать команду в устройство и как прочитать ответ? Я конечно понял что нужно типа обработать файл, но нельзя ли по точнее для чайника?


 
GanibalLector ©   (2004-04-24 17:48) [3]

function LStr(const Source:Ansistring;Count:Integer):Ansistring;
begin
 Result:=Copy(Source,1,Count);
end;

function OpenComm(Mode:AnsiString):THandle;
var
 DCB : TDCB;
 TOut: TCommTimeouts;
 I:Integer;
 Bfr:AnsiString;
begin
 Bfr:=Mode;
 UniqueString(Bfr);
 I:=Pos(":",Bfr)-1;
 if I<=0 then I:=4;
 Result := CreateFile(PChar(LStr(Bfr,I)),GENERIC_READ or GENERIC_WRITE,
        0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

 GetCommState( Result, DCB) ;
 BuildCommDCB(PChar(Bfr),DCB);
 DCB.EvtChar := #13;
 SetCommState( Result, DCB) ;
 //
 TOut.ReadIntervalTimeout         := MAXDWORD;
 TOut.ReadTotalTimeoutMultiplier  := 0;
 TOut.ReadTotalTimeoutConstant    := 0;
 TOut.WriteTotalTimeoutMultiplier := 0;
 TOut.WriteTotalTimeoutConstant   := 0;
 SetCommTimeOuts( Result, TOut);
   SetCommMask(Result,EV_RLSD OR EV_RXFLAG);
   PurgeComm(Result,PURGE_TXCLEAR);      //clear transmit buffer
   PurgeComm(Result,PURGE_RXCLEAR);      //clear receive buffer
end;

function ReadComm(Handle:THandle; var Bfr:AnsiString):Integer;
var
 I,J:DWord;
begin
 Result:=0;
 J:=Length(Bfr);
 repeat
   ReadFile(Handle, Bfr[Result+1], J-DWord(Result), I, nil);
   Inc(Result,Integer(I));
  if DWord(Result)=J then break;
 until I=0;
end;

function WriteComm(Handle:THandle; const Bfr:AnsiString):Integer;
var
 I,J:DWord;
begin
 Result:=0;
 J:=Length(Bfr);
 repeat
   WriteFile(Handle, Bfr[Result+1], J-DWord(Result), I, nil);
   Inc(Result,Integer(I));
   if DWord(Result)=J then break;
 until I=0;
end;

function CloseComm(Handle:THandle):boolean;
begin
CloseHandle(Handle);
result:=true;
end;

function SetRxTime(Handle:THandle; const TimeC,TimeM:Integer):Boolean;
var
 TOut:TCommTimeouts;
begin
 if (TimeC=0) AND (TimeM=0) then
   TOut.ReadIntervalTimeout       := MAXDWORD
 else TOut.ReadIntervalTimeout    := 0;
 TOut.ReadTotalTimeoutMultiplier  := TimeM;
 TOut.ReadTotalTimeoutConstant    := TimeC;
 TOut.WriteTotalTimeoutMultiplier := 0;
 TOut.WriteTotalTimeoutConstant   := 0;
 Result:=SetCommTimeOuts(Handle, TOut);
end;

...
//кусок кода из моей dll
Handle:=OpenComm("COM"+co+":BAUD="+baud+" PARITY=N DATA=8 STOP=1");
 if Handle=INVALID_HANDLE_VALUE then begin result:=false;exit;end;
 if GetFileType(Handle)<>FILE_TYPE_CHAR then begin result:=false;exit;end;
 setrxtime(handle,100,25);   //100,25
2:str:="";
1:setlength(st,1);
   if readcomm(Handle,st)=1 then begin
   if st<>chr($0d) then begin str:=str+st;goto 1;end else begin
                                       writecomm(Handle,chr($0d));
                                       setlength(st,1);


 
Павел   (2004-04-25 10:27) [4]

ReadFile, WriteFile это правильно, но лучше чтение порта делать в отдельном потоке и асинхронно. Примеры на Delphi по этому поводу:
http://bhv.ftk.spbstu.ru/books/book.php?id=2732
http://www.ozon.ru/context/detail/id/1656093/


 
windkz ©   (2004-04-25 10:39) [5]

Спасибо! Попробую...



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.033 c
1-1084939263
Cryon
2004-05-19 08:01
2004.05.30
Как завершить работу приложения


14-1084124744
TCrash
2004-05-09 21:45
2004.05.30
Стили музыки


9-1074682745
ZAROLF
2004-01-21 13:59
2004.05.30
Универсальный 3D движок и его написание


1-1084565683
AlexCo_
2004-05-15 00:14
2004.05.30
Кодировка


3-1083919987
lockheed_man
2004-05-07 12:53
2004.05.30
Проблемы с сохранением если не все поля грида заполнены