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

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

Чтение COM port под XP [D7, Win95/98, WinXP]


Сканер ©   (2007-03-22 09:38:00) 

ЧИтаю данные со сканера штрих кодов (CreateFile, ReadFile и пр.) На старом компе (win98) все здорово. Попробовал на новом (XP) - Get(Set)CommState,get(set)commtimeouts отрабатывают, а ReadFile пусто и всё. Куда копать?


clickmaker   (2007-03-22 11:12:00) [1]


> [11] wal ©   (22.03.07 10:36)

To specify a COM port number greater than 9, use the following syntax: "\\\\.\\COM10".
(с) MSDN

но, в общем, не принципиально, согласен. Там видимо дело было в overlapped


Сканер   (2007-03-22 10:56:00) [2]

туплю:)
всё разобрался. респект всем за помошь


Сканер   (2007-03-22 10:38:00) [3]

2tesseract
 как читать в синхронном?
 с портами не работал - больше с БД:)
 скопировал из примера где-то и в 98 работает нормально
2clickmaker
про \\.\COM1' и 'COM1' написано в статье на главной странице


wal   (2007-03-22 10:36:00) [4]

>[10] clickmaker ©   (22.03.07 10:31)
Зачем?


clickmaker   (2007-03-22 10:31:00) [5]


> hCid:=CreateFile('\\.\COM1'

замени на CreateFile('COM1'


tesseract   (2007-03-22 10:23:00) [6]


> ReadFile(hCid,d,SizeOf(d),BytesRead,@ovr);


Ты порт открываешь в синхронном режиме, а читаешь в асинхронном. Что же ты хочешь?


Сканер   (2007-03-22 10:19:00) [7]

да всё по простому  
hCid:=CreateFile('\\.\COM1',GENERIC_READ,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORM AL,0);
 SetupComm(hCid,256,256);

 GetCommState(hCid,dcb);
 dcb.BaudRate:=9599;
 dcb.ByteSize:=8;
 dcb.Parity:=NoParity;
 dcb.StopBits:=onestopbit;
 setcommstate(hcid,dcb);

 getcommtimeouts(hcid,timeouts);
 timeouts.ReadIntervalTimeout:=maxdword;
 timeouts.ReadTotalTimeoutMultiplier:=0;
 timeouts.ReadTotalTimeoutConstant:=0;
 timeouts.WriteTotalTimeoutMultiplier:=0;
 timeouts.WriteTotalTimeoutConstant:=0;
 setcommtimeouts(hcid,timeouts);

а потом

ReadFile(hCid,d,SizeOf(d),BytesRead,@ovr);

после создания
SysErrorMessage(GetLastError()) - операция успешно завершена
а READ говорит неверный дескриптор


Kolan   (2007-03-22 10:14:00) [8]

SysErrorMessage(GetLastError())
Вставь после каждого вызова API функции, погляди что получется.
Покажи код открытия порта и чтения…


Сканер   (2007-03-22 10:13:00) [9]

нет не потокб по таймеру читаю. считывания не часто случаются - всё без накладок работает в 98


Kolan   (2007-03-22 10:07:00) [10]

> 6

Поток используешь? Что-то сним имхо, скореевсего он уже умер, а ты обращаешься…


Reindeer Moss Eater   (2007-03-22 09:59:00) [11]

6

Собственно вот тебе и ответ куда копать.


clickmaker   (2007-03-22 09:56:00) [12]

SysErrorMessage(GetLastError())
есть еще замечательная функция RaiseLastWin32Error, ну для любителей try except


Сканер   (2007-03-22 09:52:00) [13]

6


Reindeer Moss Eater   (2007-03-22 09:41:00) [14]

getlasterror


Наверх

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