Форум: "Система";
Текущий архив: 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.034 c