Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Странности чтения с СОМ порта [D6, Win2k, WinXP]


*Pavel ©   (2004-09-10 16:13:00) 

К 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;


simpson   (2004-09-10 17:54:00) [1]

Читать данные со сканера штрих-кодов по таймеру?
Мдя... Извращенцами земля полнится....


*Pavel   (2004-09-10 16:44:00) [2]

Тема снята, глюк я нашел сам.
Stat.cbInQue = 14 при длине буфера в 12 символов. Т.е. было два каких-то управляющих символа. Расширил буфер до 14 символов - все заработало.


вразлет   (2004-09-10 16:40:00) [3]

Чему равно значение переменной Bytes после выполнения строчки?

ReadFile(hCOM, DataBuf, BufSize, Bytes, nil);


Наверх

Титульная страница Поиск, карта сайта Написать письмо