Текущий архив: 2004.10.10;
Скачать: CL | DM;
Вниз
Странности чтения с СОМ порта Найти похожие ветки
← →
*Pavel © (2004-09-10 16:13) [0]К COM порту подключен сканер штришкодов. Интересный глюк получается: при первом считывании в Memo1 он выдает полную строку, при втором - на два символа короче, при третьем - эти недостающие два символа, и т.д.
Исх. код: 020453451230
1 чтение) 0204534512
2 чтение) 30
3 чтение) 02045345
4 чтение) 1230
5 чтение) 020453
6 чтение) 451230
7 чтение) 0204
8 чтение) 53451230
9 чтение) 02
10 чтение)0453451230
11 чтение)020453451230
Т.е. происходит циклическое смещение и на 11-ом чтении все возвращается на место. В чем может быть причина ?
Код программы прилагается:
var
Form1: TForm1;
hCom, hOutFile : tHandle;
DCB: TDCB;
Stat: TCOMStat;
Lock: Bool;
ByteCount: Dword;
DataBuf: array[1..12] of char;
const
BufSize = SizeOf(DataBuf);
OutxCtsFlow = $00000004;
RtsControlHandshake = $00002000;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Stat.cbInQue := 0;
ByteCount := 0;
Lock:= true;
hCOM := CreateFile("COM1", GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if hCOM = INVALID_HANDLE_VALUE then begin
ShowMessage("Не могу открыть порт");
Application.Terminate;
end;
SetupComm(hCOM, 2048, 2048);
with DCB do begin
BaudRate := 9600;
ByteSize := 7;
Parity := SPACEPARITY;
StopBits := TWOSTOPBITS;
Flags := Flags or OutxCtsFlow or RtsControlHandshake;
end;
if not SetCommState(hCOM, DCB) then begin
ShowMessage("Порт не настроен");
Application.Terminate;
end;
Lock := False;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseHandle(hCOM);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var i, Blocks, Errors, Bytes : dWord;
begin
if not Lock then begin
Lock :=true;
ClearCommError(hCOM, Errors, @Stat);
Blocks := Stat.cbInQue div BufSize;
if Blocks > 0 then
for i := 1 to Blocks do begin
ReadFile(hCOM, DataBuf, BufSize, Bytes, nil);
Memo1.Lines.Add(Databuf);
inc(ByteCount, Bytes);
end;
Lock := False;
end;
end;
← →
вразлет © (2004-09-10 16:40) [1]Чему равно значение переменной Bytes после выполнения строчки?
ReadFile(hCOM, DataBuf, BufSize, Bytes, nil);
← →
*Pavel © (2004-09-10 16:44) [2]Тема снята, глюк я нашел сам.
Stat.cbInQue = 14 при длине буфера в 12 символов. Т.е. было два каких-то управляющих символа. Расширил буфер до 14 символов - все заработало.
← →
simpson © (2004-09-10 17:54) [3]Читать данные со сканера штрих-кодов по таймеру?
Мдя... Извращенцами земля полнится....
Страницы: 1 вся ветка
Текущий архив: 2004.10.10;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.027 c