Вот все необходимые функции для работы с com'ами у меня принимает все байты и типа 0x00.
Код:
function PortInit : boolean; //инициализация порта
var
ct: TCommTimeouts;
dcb: TDCB;
comport_arr :^char;
ptmp :^char;
i:integer;
begin
f := Windows.CreateFile(PChar(comport), GENERIC_READ or // comport - переменная типа string, номер компорта в формате 'COM3', 'COM11', 'COM1' и т.п.
GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,
nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (f <= 0) or not Windows.SetupComm(f, 2048, 2048)or not
Windows.GetCommState(f, dcb) then exit; //init error
dcb.BaudRate := 9600;
dcb.StopBits := 0;
dcb.Parity := 2;
dcb.ByteSize := 8;
if not Windows.SetCommState(f, dcb)
or not Windows.GetCommTimeouts(f, ct) then exit; //error
ct.ReadTotalTimeoutConstant := 50;
ct.ReadIntervalTimeout := 50;
ct.ReadTotalTimeoutMultiplier := 1;
ct.WriteTotalTimeoutMultiplier := 0;
ct.WriteTotalTimeoutConstant := 10;
if not Windows.SetCommTimeouts(f, ct)
or not Windows.SetCommMask(f, EV_RING + EV_RXCHAR + EV_RXFLAG + EV_TXEMPTY)
then exit; //error
PortInit := true;
end;
function DoneComm: boolean; //закpыть поpт
begin
DoneComm := Windows.CloseHandle(f);
end;
function PostComm(var Buf; size: word): integer; //пеpедача в поpт
var
p: pointer;
i: cardinal;
begin
p := @Buf;
result := 0;
while size > 0 do begin
if not WriteFile(f, p^, 1, i, nil) then exit;
inc(result, i); inc(integer(p)); dec(size);
Application.ProcessMessages;
end;
PostComm := result;
end;
function ReadComm(var Buf; size: word): integer; //пpием из поpта
var
i: cardinal;
ovr: TOverlapped;
begin
fillChar(buf, size, 0);
fillChar(ovr, sizeOf(ovr), 0); i := 0; result := -1;
if not windows.ReadFile(f, buf, size, i, @ovr) then exit;
result := i;
ReadComm := result;
end;
Вначале нужно сделать инициализацию comporta затем чтобы что-то отправить или принять пользуемся процедурами PostComm и ReadComm
отправляем и принимаем массивами байтов.
Код:
var ByteArr: array [1..4] of byte;
для отправки я делаю так:
Код:
var ByteArr: array [1..4] of byte =
(0x02, 0x00, 0x00, 0x00);
Так-же не забываем что первые два байта обычно информационные и несут размер последующего сообщения.
Из любого места программы вызываем так:
Код:
PostComm(ByteArr, 4); // Вторым числом указываем размер массива
И так на приём:
Код:
ReadComm(ByteArr, 4); // Здесь массив можно ставить больше размера входящей информации т.к. изначально размер скорее всего неизвестен
Надеюсь я помог
.