Уведомления
Очистить все

Delphi и COM-порт

1 Записи
1 Пользователи
0 Likes
359 Просмотры
151-150 Okolokompa Форум
(@anonim)
Trusted Member
Присоединился: 4 года назад
Записи: 25
Создатель темы  

Интересный код от автора Vitalya_Ventel:

// Асинхронный принцип чтения СОМ-порта
procedure PortInit(COM: String);
var ThreadID: DWORD;
begin
KolByte:=0;
//Создание и иницализация порта
CommHandle := CreateFile(PChar(COM), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);

//Устанавливаем DCB
GetCommState(CommHandle,DCB);
DCB.BaudRate:=CBR_56000;
DCB.Parity:=NOPARITY;
DCB.ByteSize:=8;
DCB.StopBits:=OneStopBit;
SetCommState(CommHandle,DCB);

// Сброс порта
PurgeComm(CommHandle,PURGE_TXCLEAR or PURGE_RXCLEAR);

//Ставим маску
SetCommMask(CommHandle,EV_RXCHAR);

//Создаем паралельный поток, там будет вертеться процедура приема строки с порта - ReadComm
CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
end;

Procedure ReadComm;
var
mybyte:string;
i:integer;
Resive:array [0..255] of byte;
Shex, Shexc: string;

begin
Shex:='';
while true do
begin
TransMask:=0;
WaitCommEvent(CommHandle,TransMask,@Ovr);
if (TransMask and EV_RXCHAR)=EV_RXCHAR then
begin
// Узнаем сколько байт данных находится в буфере передачи последовательного порта
ClearCommError(CommHandle,Errs,@Stat);
Kols := Stat.cbInQue;
ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);
For i := 0 To 129 do
If StrToInt(Resive[i]) <= 15 Then
Shex := Shex + '0' + Format('%0x',[StrToInt(Resive[i])]) + ' '
Else
Shex := Shex + Format('%0x',[StrToInt(Resive[i])]) + ' ';
For i := 1 to Length(Shex) do
If Shex[i] <> ' ' Then Shexc := Shexc + Shex[i];
Sleep(10000);
end;
end;
end;

   
Цитата
Поделиться: