Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перередача и прием данных через com порт в Windows  (Прочитано 11244 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Leo_Need
Гость
« : 28-04-2004 15:13 » 

Есть проблема. Нужно принимать данные из паралельного порта. Делаю это по примерно следующему алгоритму:
1. Создаем хендл через CreateFile  на com1.
2. Делаем ReadFile от этого хендла.
Тут-то и суть проблемы. Если в данный момент ничего не приходит то ReadFile не отдает управление программе. Время этого неотдавания регулируется спец. функцией SetCommTimeout, но даже если поставить там задерку в милисекунду, у винды эта задержка преращается в 300-500 милисекунд. Причем в это время нельзя ничего послать на этот порт из другой нити программы. Отсюда вопрос:
Как узнать есть ли в данный момент в буфере приема какой-нибудь символ который могла бы считать ReadFile?
Или может быть есть метод как заставить ReadFile мгновенно возвращать управление даже если ничего в буффере нет.

p.s. Попытки проводились под ХР.

Заранее спасибо, Леонид.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 28-04-2004 15:33 » 

Уже много раз на эту тему тему говорили, и про эту проблему тоже.
Поищи на форуме. Там даже исходники есть. Ну ежели не найдёшь, то тогда завтра помогу.

Суть сводится к след. Тебе надо делать не Синхронный а Асинхронный файл,
посмотри в MSDN последний параметр CreateFile. Тогда ReadFile выскакмвает по таймингу установленному SetCommTimeout.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Serega
Гость
« Ответ #2 : 28-04-2004 23:18 » 

А еще проще использовать компонент для работы с COM-портом
Записан
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 29-04-2004 04:19 » 

m_hComPort = CreateFile(lpComPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
...
COMSTAT     csStat;
csStat.cbInQue - количество пришедших, но не прочитанных байт
Записан

Fatal error C1: Brain expected
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #4 : 29-04-2004 07:02 » 

Уй, точно! Сорри  :oops:  Не последний, а предпоследний параметр.
А из кода можешь привести часть где ты делаешь CreateFile,  SetCommTimeout и ReadFile.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Xeysan
Гость
« Ответ #5 : 29-04-2004 13:01 » 

Есть классическая статья на эту тему: Serial Communications in Win32, ищи в MSDN. Там есть описание перекрывающего ( то, что тебе нужно ) метода доступа к порту.
Записан
Pu
Большой босс

ru
Offline Offline
78


« Ответ #6 : 30-04-2004 06:11 » 

Цитата

Есть проблема. Нужно принимать данные из паралельного порта. Делаю это по примерно следующему алгоритму:
1. Создаем хендл через CreateFile на com1.


непонятен чуть-чуть вопрос, если данные из параллельного порта - зачем открывать СОМ1? данные на СОМ1 из ЛПТ не пройдут ни с каким таймаутом и соусом.  Отлично
 Если уважаемый опечатался приношу извинения за оффтопп.
Если интересует могу на почту сбросить свои тексты по обмену через СОМЫ. Я сделал реализацию как СОМ-сервер. И прием данных осуществляется в отдельном потоке.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #7 : 30-04-2004 07:45 » 

Pu,  Молодец! Я  тоже сразу не заметил.

Leo_Need,  Ау! Ты где? Внеси ясность.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines