Показать сообщение отдельно
  #5  
Старый 03.05.2011, 21:48
HunteRus HunteRus вне форума
Прохожий
 
Регистрация: 02.10.2010
Адрес: В Питере
Сообщения: 14
Версия Delphi: Delphi5
Репутация: 10
По умолчанию

Вот все необходимые функции для работы с 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); // Здесь массив можно ставить больше размера входящей информации т.к. изначально размер скорее всего неизвестен

Надеюсь я помог .
__________________
Код:
procedure UnleassFor(i: int64) UnleassFor(i + 1);

...

UnleassFor(0);
Бесконечный For
Ответить с цитированием