Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.47 MB
Время: 0.022 c
1-1095847401
kukuikar
2004-09-22 14:03
2004.10.10
Не работает #9 - табуляция в ListBox


1-1096008578
eagle2002
2004-09-24 10:49
2004.10.10
ActiveX


14-1095527647
Knight
2004-09-18 21:14
2004.10.10
Что стало с компактами?


1-1096030702
Mirror
2004-09-24 16:58
2004.10.10
GetLogicalDrives


14-1095758186
Margel
2004-09-21 13:16
2004.10.10
Посоветуйте, что выбрать для изучения, .net или java??