Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2016, 21:45   #1
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию Работа с Com - портом

Пытаюсь работать с RS-232, ОС Windows 7.
Программа с периодом пару секунд пытается получить массив данных фиксированной длины, около 20 кБайт со скоростью 115200 бит/с.
Для получения массива данных источнику информации высылается байт запроса.
Режим - не overlay.
Удается это сделать без сбоев с вероятностью ~94%. В случае сбоя как правило получается на десяток байт меньше (реже - на сотню).
Вопрос: кто - нибудь пытался решить подобную задачу? Что получилось?
Dmitry_B вне форума Ответить с цитированием
Старый 11.11.2016, 22:47   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Использовать аппаратный контроль потока. Ибо виндоус эта не система реального времени, как следствие выход из таймера в 2 секунды может наступить и в 2٫25 с
Или программный контроль потока на XOn/XOff и начинать читать заранее и оканчивать чуть дольше, по моей статистики задержки между квантами исполнения потока не привыкают 250 мс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 11.11.2016, 23:03   #3
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Мой метод прост: запрос - WriteFile, вызов ReadFile для считывания.
ReadFile приостанавливает мою программу до тех пор, пока не получит заданное количество байт, или не истечет время получения информации в соответствии с COMMTIMEOUTS.
Пробовал вставлять Sleep(2000) между запросом и получением - на исход не повлияло. Разумеется, буфер приема информации установлен с запасом: 32768.
Интересно, что если перед запросом вызвать Beep(400,1), например, то программа просто виснет.
Dmitry_B вне форума Ответить с цитированием
Старый 11.11.2016, 23:10   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А что у нас в COMMTIMEOUTS?
А как DCB был заполнен?

Последний раз редактировалось waleri; 11.11.2016 в 23:17.
waleri вне форума Ответить с цитированием
Старый 11.11.2016, 23:17   #5
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

А чего только не перепробовано. Всего и не упомню. В общем, при недостаче данных, ждать выхода из ReadFile приходилось гораздо больше 2-х секунд.
Да, еще вот что: установлено достоверно, что первые 3 байта всегда передаются правильно, а где-то после первой трети массива наблюдается смещение элементов массива к началу на 88 байт, 80 байт, 8 байт... Данные не просто передаются не полностью - они искажаются.
DCB: обмен байтами по 8 бит, без квитирования, без четности и прочих премудростей вроде обнаружения свободной линии и т.п.

Последний раз редактировалось Dmitry_B; 11.11.2016 в 23:26. Причина: Вспомнил кое-что
Dmitry_B вне форума Ответить с цитированием
Старый 12.11.2016, 09:26   #6
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

1- обсуждение сферического коня без кода в теме, что наворотил TC можно только догадываться как вычитываются и накапливаются данные
2- так как неизвестно время и таймаут приняли за 2 секунды, то в DCB параметр ReadTotalTimeoutConstant = 2000
3- если передающая сторона столь нестабильна и без битов контроля, то ReadIntervalTimeout = ReadTotalTimeoutMultiplier = MAXDWORD
4- таймер запроса данных увеличить до 3-4 секунд
5- лезть в VCL из потока чтения без синхронизе, и уж тем паче пихать туда sleep() верх невежества
6- где собственно протокол обмена с устройством?
kutani вне форума Ответить с цитированием
Старый 12.11.2016, 10:20   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
при недостаче данных, ждать выхода из ReadFile приходилось гораздо больше 2-х секунд.
Вот поэтому я и спросил что прописано в COMMTIMEOUTS а вы мне что в ответ?
waleri вне форума Ответить с цитированием
Старый 12.11.2016, 11:22   #8
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Цитата:
Сообщение от kutani Посмотреть сообщение
1- обсуждение сферического коня без кода в теме, что наворотил TC можно только догадываться как вычитываются и накапливаются данные
2- так как неизвестно время и таймаут приняли за 2 секунды, то в DCB параметр ReadTotalTimeoutConstant = 2000
3- если передающая сторона столь нестабильна и без битов контроля, то ReadIntervalTimeout = ReadTotalTimeoutMultiplier = MAXDWORD
4- таймер запроса данных увеличить до 3-4 секунд
5- лезть в VCL из потока чтения без синхронизе, и уж тем паче пихать туда sleep() верх невежества
6- где собственно протокол обмена с устройством?
Я, собственно, и не рассчитывал на обсуждение моего кода.
Вопрос был: кто-то что-то подобное делал? Что получилось?
По п.5 - ничего не понял. Пояснить можно?
Dmitry_B вне форума Ответить с цитированием
Старый 12.11.2016, 11:27   #9
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Вот поэтому я и спросил что прописано в COMMTIMEOUTS а вы мне что в ответ?
Сейчас нет у меня этой программы. Да и дальнейшая возня с ней - лишние затраты времени. 94% без сбоев не так плохо. Интересно, что другие добились.
Dmitry_B вне форума Ответить с цитированием
Старый 12.11.2016, 12:50   #10
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Цитата:
Я, собственно, и не рассчитывал на обсуждение моего кода.
в этом и проблема всех партизан на форумах.

Цитата:
Вопрос был: кто-то что-то подобное делал? Что получилось?
делалось, все получилось. Например по Modbus-у запрос и чтение нескольких мегабайт архивных данных с ПЛК Segnetics. Полет нормальный, все 100% без сбоев в режиме 24х7, а вопрос бессмысленный.

Цитата:
По п.5 - ничего не понял. Пояснить можно?
не видя вашего кода? Например sleep тормозит ваш основной поток во время которого информация может потеряться при приеме.

Цитата:
Да и дальнейшая возня с ней - лишние затраты времени
т.е. затраты времени форумчан на выяснение реальных причин проблемы не в счет, ну и судя по "Интересно, что другие добились. " цель темы исключительно в этом )))
kutani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с COM-портом bakanaev Общие вопросы Delphi 1 23.10.2012 17:24
Работа с COM-портом Georgios Общие вопросы Delphi 12 28.09.2010 10:31
Работа с com портом Валера777 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 05.12.2009 00:06
Работа с COM-портом jovanny Помощь студентам 2 03.05.2009 18:06
Работа с COM портом hoba Общие вопросы Delphi 3 20.11.2008 03:39