Ответы пользователя по тегу Delphi
  • Delphi и COM-порт, какой идеальный код для чтения?

    @vitalyaventel Автор вопроса
    Пришлось немного поскрести по сусекам и привести код к такому виду: пока сбоев не дал
    // Асинхронный принцип чтения СОМ-порта
    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;
    Ответ написан
    Комментировать