Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.05.30;
Скачать: [xml.tar.bz2];

Вниз

проблема с 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.032 c
3-1083617193
SergP
2004-05-04 00:46
2004.05.30
Модификация записей в одной таблице сразу из двух TAdoQuery.


11-1074438248
Neznaika
2004-01-18 18:04
2004.05.30
MHLame для Delphi6


3-1083650137
TankMan
2004-05-04 09:55
2004.05.30
Что делать со скроллингом в DBGrid


14-1084469473
хз
2004-05-13 21:31
2004.05.30
UI дизайн


3-1084352586
}|{yk
2004-05-12 13:03
2004.05.30
Как програмно поменять юзера в IBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский