@vitalyaventel

Delphi и COM-порт, какой идеальный код для чтения?

Использую библиотеку BComPort. Работаю с штрих-кодом - pdf417. С каких-то сканеров читает штрих-код с каких-то нет, то читает - то нет. В чем проблема такого поведения сканеров ? Где универсальный код для чтения данных? Сканеры: Honeywell Xenon 1900, Datalogic Griphon 4400, Metrologic MS1600 и т.п.
  • Вопрос задан
  • 12965 просмотров
Решения вопроса 2
serbod
@serbod
Зачем вам такой мазохизм, когда есть synaser?
Ответ написан
@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;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
EvgenijDv
@EvgenijDv
C/C++ programmer
Напишите свой идеальный код для работы с COM портом на чистом WinAPI.
Либо давайте примеры кода, логи COM снифера и всяческой конкретики в описании проблемы
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы