Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1

Чтение ком порта с отключенным устройством

22.12.2014, 09:55. Показов 1811. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такая задача написать модуль для проверки работает ли устройство подключённое по RS(COM порт).Для проверки я просто читаю данные и анализирую если есть байт синхронизации то устройство включено если нет значит оно или отключено или неправильно настроен ком порт. Проблема в том что при отключенном ком порте чтение зависает так как нет данных для чтения как можно ли это как то отловить как ошибку или есть другие методы решить эту проблему

Создание подключение к ком порту
C++
1
2
3
4
5
6
7
8
HANDLE fIle=CreateFile("COM4",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING, 0);
 
if(fIle==INVALID_HANDLE_VALUE){
 
    MessageBox(_T("Не удалось открыть порт"), _T("Error"), MB_ICONERROR | MB_OK);
 
return;
}
Поиск оборудования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
BOOL ModuleRLC::SearchRLC(){
 
    DWORD iSize;
    byte reData=0;
    
    int i=0;
    while (true)
    {
        
        ReadFile(PORT,&reData,1,&iSize,0); /// зависает если выключен прибор
 
      i++;
      if(reData==170 || i>(22*4))
      {
          break;}
 
    }
 
    if(reData==170){return TRUE;}else  ///170 байт синхронизации 
    {
        return FALSE;
    }
 
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.12.2014, 09:55
Ответы с готовыми решениями:

Как обрабатывать результат буфера ком-порта(запись, чтение)?
Такой вопрос. Пишу программу, которая работает с гипертерминалом на другом компе. На прием, пишу например так char buf="hello";...

Как удалить сопряжение с отключенным устройством на ноуте?
Хочу передать файл через блютуз на планшет,раньше сопряжение было,потом на планшете удалила.А теперь я передать ничего не могу.Пишет вот...

Отображение ком порта
Добрый день! Хочу сделать так, чтобы выпадающий список ComboBox показывал подключенные ком порты: <ComboBox...

12
38 / 38 / 11
Регистрация: 27.09.2014
Сообщений: 491
22.12.2014, 12:02
А если использовать WaitForSingleObject()?
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
22.12.2014, 12:05  [ТС]
Vovka, как? и для чего? мне нужно как то обойти зависание на чтение ком порта
0
38 / 38 / 11
Регистрация: 27.09.2014
Сообщений: 491
22.12.2014, 12:24
А почитать прежде чем спрашивать???
0
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
22.12.2014, 12:28  [ТС]
Vovka, умный да? долго искал?, ты скажи идею а как использовать я сам разберусь
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.12.2014, 12:31
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

http://msdn.microsoft.com/en-u... 85%29.aspx и простая проверка (сколько байт прочитано из порта?) спасут отца русской демократии.
1
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
22.12.2014, 13:21
Капай доку по ClearComError
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
22.12.2014, 13:45  [ТС]
CheshireCat, да спасло спс)) а можно установить тайм аут в миллисекундах? не хочу запускать проверку в отдельном потоке
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.12.2014, 13:56
Лучший ответ Сообщение было отмечено generation472 как решение

Решение

Так он и устанавливается именно в миллисекундах.
Комбинируй величины ReadIntervalTimeout, ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant.
1
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
22.12.2014, 14:14  [ТС]
CheshireCat, ок просто есть очень маленькая задержка около секунды
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.12.2014, 14:23
А почему она у тебя появляется? Приведи свой код, поглядим.
0
 Аватар для generation472
24 / 24 / 7
Регистрация: 04.11.2011
Сообщений: 566
Записей в блоге: 1
22.12.2014, 14:27  [ТС]
CheshireCat,


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
BOOL ModuleRLC::SearchRLC(){
 
    COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts(PORT,&CommTimeOuts);
        CommTimeOuts.ReadIntervalTimeout = 1;
        CommTimeOuts.ReadTotalTimeoutMultiplier = 1;
        CommTimeOuts.ReadTotalTimeoutConstant = 1;
        CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
        CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(PORT, &CommTimeOuts);
 
 
    DWORD iSize;
    byte reData=0;
    
    int i=0;
    while (true)
    {
        
        ReadFile(PORT,&reData,1,&iSize,0);
 
      i++;
      if(reData==170 || i>(22*4))
      {
          break;}
 
    }
 
     CommTimeOuts.ReadIntervalTimeout = 0;
        CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
        CommTimeOuts.ReadTotalTimeoutConstant = 0;
        CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
        CommTimeOuts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(PORT, &CommTimeOuts);
 
 
 
    if(reData==170){return TRUE;}else
    {
        return FALSE;
    }
}
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
22.12.2014, 15:55
Гмм. Ну, вот это место я бы переписал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    int retry = 0;
    do
    {
        BOOL result = ReadFile(PORT, &reData, sizeof(reData), &iSize, 0);
        if ( result && 
             (iSize == sizeof(reData) && (reData==170 || i>(22*4)))
           )
        {
            // успешно, прибор включен и что-то прислал
            break;
        }
        retry++;
    }
    while (retry < 3);
(Disclaimer: допускаю, что там в твоем коде могут быть еще какие-то завязки....)

И потом ставить CommTimeouts в нули уже не надо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2014, 15:55
Помогаю со студенческими работами здесь

Инициализации ком порта
Нужно прочитать данные с ком порта, но перед этим его открыть. У нас есть USB RS 485 , при подключении создается какой-то COM порт. Нужно...

2 ком порта с одним прерыванием
Линухи под рукой нет, но вопрос (хоть и чайника но), требует быстрого разрешения. В Bash скрипте поменял значения для 2-х ком портов....

вопрос по скорости ком порта
есть оригинальная программа для обмена данными с сотовым телефоном. но версия моего аппарата не поддерживается. на основе команд с нее...

Перекодировать данные с ком порта
Доброго времени суток, ребят подскажите как в дельфи получить данные как в мониторе COM. В мониторе вижу так: . В отладчике дельфи 6...

Функция чтения ком порта
Господа помогите новичку. Необходимо написать функцию чтения строк с ком порта длина которых больше 19. DLL_API DWORD COM_Read( DWORD...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru