Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование COM порта, при попытке считать ReadFile() виснет 
:(
    Опции темы
Allest
Дата 30.9.2003, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.9.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Есть прибор, который с определённой периодичностью посылает данные на COM-порт.
Я открыл этот порт (CreateFile), настроил как требуется (Скорость 19200, 8 бит, 1 стоповый), и начинаю считывать в Thread с помощью ReadFile, но где-то на 7 вызове этой функции Thread виснет.

Почему? помогите.

поток информации почти 2 кб в секунду

PM ICQ   Вверх
Ars
Дата 30.9.2003, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Покажи код инициализации порта и чтения


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
shedon
Дата 30.9.2003, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Может виснуть из-за того, что время ожидания данных при чтении стоит 0. И если на порт не приходит, указанное в ReadFile, число байт, то функция не возвращает управление, вызвавшему её потоку, до тех пор, пока не получит все байты.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Allest
Дата 30.9.2003, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 17.9.2003
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Инициализация
Код

DCB dcb;
COMMTIMEOUTS ct;
DWORD dwErr;
// Настройка скорости
GetCommState (m_Com, &dcb);
dcb.BaudRate   = CBR_19200;
dcb.ByteSize   = 8;
dcb.Parity    = NOPARITY;
dcb.StopBits   = ONESTOPBIT;
dcb.ErrorChar   = 0;
dcb.fBinary    = TRUE;
dcb.fAbortOnError = dcb.fDsrSensitivity =
dcb.fDtrControl = dcb.fErrorChar = dcb.fInX = dcb.fNull =
dcb.fOutX = dcb.fOutxCtsFlow = dcb.fOutxDsrFlow =
dcb.fParity = dcb.fRtsControl = dcb.fTXContinueOnXoff =
dcb.fDummy2 = 0;
SetCommState(m_Com, &dcb);
//настройка буферов
SetupComm(m_Com, 19200, 19200);
// Настройка задержек
GetCommTimeouts(m_Com, &ct);
ct.ReadIntervalTimeout = 32;
ct.ReadTotalTimeoutMultiplier = 0;
ct.ReadTotalTimeoutConstant = 0;
SetCommTimeouts(m_Com, &ct);

// Установка сигналов DTR и RTS
EscapeCommFunction(m_Com, SETDTR);
EscapeCommFunction(m_Com, CLRRTS);

ClearCommError(m_Com, &dwErr, NULL);


Чтение в потоке
BYTE m_rgbD[16384];
DWORD dw;
Код

ReadFile(m_Com, m_rgbD, sizeof(m_rgbD), &dw);
Sleep(100);


Цитата
Может виснуть из-за того, что время ожидания данных при чтении стоит 0

а какое время мне установить?
PM ICQ   Вверх
shedon
Дата 30.9.2003, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: 4
Всего: 11



Цитата
а какое время мне установить?

Может тебе за один раз читать по меньше байт? Ты хочешь сразу прочесть 16384 байт, а там может приходит меньше, он и ждйт до бесконечности пока не придут все 16384 байт.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Ars
Дата 30.9.2003, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: 2
Всего: 2



Попробуй установить ReadIntervalTimeout = MAXDWORD. В хелпе написано, что такое значение в сочетании с ReadTotalTimeoutMultiplier = 0 и ReadTotalTimeoutConstant = 0 вызывает мгновенный возврат накопленного буфера, даже если там ничего нет.

ЗЫ Если не поможет, могу дать рабочий исходник

Это сообщение отредактировал(а) Ars - 30.9.2003, 13:36


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.