Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с последовательным портом, Как отлаживать под VisualStudio? 
:(
    Опции темы
Dreamer_0x01
Дата 15.8.2005, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



моя программа общается по последовательному порту с внешним прибором.
С портом работаю посредством функций ReadFile и WriteFile.

С записью в порт проблем нет. Вот с чтением часто возникают проблемы при отладке.
Посылаю команду прибору, он мне в ответ выдает какие-то данные. В терминалке проверено, что данные выдает исправно и практически без видимой задержки.
Эти данные я принимаю функцией ReadFile. А для предотвращения "зависания" на этой функции выставляю таймауты.Причем заведомо большие, чем реально требуемое время приема ответа от прибора.
Когда программа работает "сама по себе", то работает более менее нормально. Когда же начинаешь выставлять брекпоинты и отлаживать пошагово - на ReadFile сначала долго ждем, так как таймауты выставлены достаточно большие, а потом выясняется, что данная функция ничего не прочитала, то есть количество считанных символов равно 0. И причем если компилировать как релиз, то та же самая фигня происходит. А если же брекпоинт поставить после функции ReadFile, то она считывает нужное мне количество символов, но опять же не со 100% вероятностью, в 1 из 10 случаев все равно возвращает нулевой результат.

Кто вообще работал с последовательным портом в VisualStudio и может подсказать, как это лучше всего делать?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Denn
Дата 15.8.2005, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Dreamer_0x01
Ты в отдельном потоке читаешь данные?
PM MAIL ICQ   Вверх
Dreamer_0x01
Дата 15.8.2005, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Смотря какие. У меня есть данные небольшого размера (32 байта),их я читаю в главном потоке по событию WM_TIMER.
А есть данные большого размера (от 2 Кб), их я читаю пакетами по 128 байт, между которыми идет обновление прогресс-барова,информирующего о состоянии чтения . Эти данные я читаю в отдельном потоке. Во время этого потока таймер естественно приостанавливается.
и такая фигня может происходить и в том и в другом случае.

Это сообщение отредактировал(а) Dreamer_0x01 - 15.8.2005, 21:43


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
takedo
Дата 16.8.2005, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Dreamer_0x01
Даже если кто-то и занимался - то понять в чем проблема без текста сложно. Ты мог неверные флаги выставить или еще чего-нибудь, а без текста не видно где и что, поэтому все просто помолчат... будет текст - найдутся люди smile


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
Dreamer_0x01
Дата 16.8.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



takedo делаю так, как описано во многих статьях про работу с последовательным портом. Вот куски кода.

Сначала инициализируем порт:

Код

BOOL fSuccess;
СOMMTIMEOUTS ctm;
DCB dcb;
HANDLE uart;

uart=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
fSuccess = GetCommState(uart, &dcb);
dcb.BaudRate = CBR_19200;     
dcb.ByteSize = 8;             
dcb.Parity = NOPARITY;        
dcb.StopBits = ONESTOPBIT;    
dcb.fNull=false;
fSuccess = SetCommState(uart, &dcb);
ctm.ReadIntervalTimeout=0;
ctm.ReadTotalTimeoutConstant=5500;
ctm.ReadTotalTimeoutMultiplier=0;
ctm.WriteTotalTimeoutConstant=0;
ctm.WriteTotalTimeoutMultiplier=0;
SetCommTimeouts(uart,&ctm);
PurgeComm(uart,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);



Запись в порт делаю так:
Код

СString str="Test string";
DWORD TEMP;
WriteFile(uart,str,str.GetLength(),&TEMP,NULL);
PurgeComm(uart,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);


Ну а чтение так
Код

char buf[250];
unsigned char LL=200;
ReadFile(uart,buf,LL,&TEMP,NULL);


Если ReadFile проходить в пошаговом рижиме, то как правило ничего не считывает и вылетает по таймауту. Если брекпоинт ставить после этого места, то считывает, но не со 100% вероятностью.
Если запустить релизный экзешник, то нормально работает. Но мне нужно чтобы работало и в режиме отладки...


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Dreamer_0x01
Дата 17.8.2005, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


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

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



Ну так что, не у кого никаких мыслей нет?


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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