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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема, коллеги. Или, к слову о передаче данных. 
:(
    Опции темы
Гость_Alexei
Дата 26.12.2003, 09:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Итак, есть устройство (микроконтроллер ADAM, но это не суть важно), подключенное к последовательному порту, нужно связаться с ним и получить данные. Все это проходит нормально, это я сделал. Но есть досадная неприятность - когда пытаешься коннектиться к выключенному контроллеру, то программа зависает в бесконечном ожидании. Я узнал, что это нужно копать в направлении такого элемента функции CreateFile, как OVRELAPPED. Каким-то образом надо это организовать, чтобы при попытке соединения к выключенному контроллеру выдавалось сообщение и программа не завешивалась бы. Поискал я инфы по Сети и на этом форуме всплывала похожая проблема. Я столько вариантов перепробовал, но ничего не работает. Или наоборот, сообщение выдается даже и в том случае, когда устройство включено. Так все-таки, объясните, пожалуйста, кто может, как делается такая проверка. А то никаких представлений теперь нету.
Вот один из вариантов:

if(hComm==INVALID_HANDLE_ VALUE)
{
ShowMessage("ERROR");
}

Это я вставлял и перед настройкой параметров порта, и после команды WriteFile пробовал - не работает. Хотя в найденном материале оно так и использовалось.

  Вверх
shedon
Дата 26.12.2003, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Функция SetCommTimeouts устанавлмвает время ожидание. По умалчанию установленно 0, т.е. бесконечное, и программа будет зависать до получения данных.

P.S. Советую всю работу с портами производить из отдельного потока, чтобы программа не зависала.


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


Unregistered











А как это делается-то? Где бы инфы почитать?
  Вверх
shedon
Дата 27.12.2003, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
А как это делается-то?

Как делается, что ?
Поток создать можно так
Код

// Объявляем функцию нашего потока
UINT WorkThreadАгтс(LPVOID pParam);

CMyClass::MyFync()
{
    // Запускаем поток
    CWinThread *pThread =  AfxBeginThread(WorkThreadEFMD, this, THREAD_PRIORITY_NORMAL);
    ASSERT_VALID(pThread);
}

UINT WorkThreadFunc(LPVOID pParam)
{
   // Получаем указатель на класс CMyClass
   CMyClass *pMyClass = (CMyClass*)pParam;

//...

   MessageBox(NULL, "Thread begin", "Thread", MB_OK);
   return 0;
}


Цитата
Где бы инфы почитать?

Читай MSDN

Это сообщение отредактировал(а) shedon - 29.12.2003, 08:38


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


Unregistered











Если еще сюда заглянешь, то вопрос. А ты уверен, что это сработает в моем случае? Что-то я не пойму вообще, как это использовать. И где тут обращение к Сом-порту. Или это надо делать после CreateFile?
  Вверх
shedon
Дата 29.12.2003, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Если еще сюда заглянешь, то вопрос. А ты уверен, что это сработает в моем случае? Что-то я не пойму вообще, как это использовать. И где тут обращение к Сом-порту. Или это надо делать после CreateFile?


Я же сказал, что работать с портами надо в отдельном потоке(в программе всегда есть хотя бы один интерфейсный поток который обрабатывает сообщения, нажатие кнопок и т.д. если создавать долгие процессы в интерфейсном потоке то программа не будет, в это время, откликаться на сообщения пользователя и системы, т.е. зависнет!!! и поэтому мы создаём параллельный поток для работы с портами), в MyFync я создаю поток из которого запускается функция WorkThreadFunc(), а в ней мы уже можем работать с портом.

Для работы с портами в функцию WorkThreadFunc()
Код

// Открываем порт
HANDLE m_hCommCreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (m_hComm== INVALID_HANDLE_VALUE)
{
 TRACE(_T("Failed to open up the comms port\n"));
 return 0;
}
 //Get the current state prior to changing it
 DCB dcb;
 GetState(dcb);

 //Setup the baud rate
 dcb.BaudRate = 9600;
 //Setup the Parity
 dcb.Parity = 0;   //NOPARITY
 //Setup the data bits
 dcb.ByteSize = 8;
 //Setup the stop bits
dcb.StopBits = 0;  //ONE STOPBIT
 //Setup the flow control
 dcb.fDsrSensitivity = FALSE;
// NoFlowControl
 dcb.fOutxCtsFlow = FALSE;
 dcb.fOutxDsrFlow = FALSE;
 dcb.fOutX = FALSE;
 dcb.fInX = FALSE;
 SetState(dcb);

// Устанавливаем время ожидания
 COMMTIMEOUTS timeouts;
 timeouts.ReadIntervalTimeout = 500;
 timeouts.ReadTotalTimeoutConstant = 1000;
 timeouts.ReadTotalTimeoutMultiplier = 500;
 if (!SetCommTimeouts(m_hComm, timeouts))
 {
   TRACE(_T("Failed in call to SetCommTimeouts\n"));
   return 0;
 }

// Запись в порт
 DWORD dwBytesWritten = 0;
 const void* lpBuf = "Write to Port";
 if (!WriteFile(m_hComm, lpBuf, strlen(lpBuf ), &dwBytesWritten, NULL))
 {
   TRACE(_T("Failed in call to WriteFile\n"));
   return 0;
 }

// Чтение из порта
 DWORD dwBytesRead = 0;
 BOOL bSuccess = ReadFile(m_hComm, lpBuf, strlen(lpBuf ), &dwBytesRead, NULL);
 if (!bSuccess)
 {
   if (GetLastError() != ERROR_IO_PENDING)
   {
     TRACE(_T("Failed in call to ReadFile\n"));
     return 0;
   }
 }

// Закрываем порт
   BOOL bSuccess = CloseHandle(m_hComm);
   m_hComm = INVALID_HANDLE_VALUE;
   if (!bSuccess)
     TRACE(_T("Failed to close up the comms port, GetLastError:%d\n"), GetLastError());



--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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