Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Excel VBA, CAD, Софт, ОС, Windows, Ubuntu, Android, VPS
Win Api, Assembler, C++, Java, Pascal, Lazarus, Delphi, OpenGL, DirectX
C#, Qt, .NET, ASP.NET, Windows Forms, ADO.NET, Framework, WPF, UWP, WinRT, XAML
HTML, CSS, JavaScript, Ajax, PHP, Perl, Python, Ruby, SQL, WordPress, API, XML, JSON, ActionScript, Flash

Ответ
 
Опции темы
Старый 11.11.2016, 22:45   #1
Dmitry_B
Форумчанин
 
Регистрация: 29.03.2009
Сообщений: 57
Репутация: 14
По умолчанию Работа с Com - портом

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

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

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

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

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

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

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

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

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

Цитата:
Сообщение от 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, 12:27   #9
Dmitry_B
Форумчанин
 
Регистрация: 29.03.2009
Сообщений: 57
Репутация: 14
По умолчанию

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

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

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

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

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с COM-портом bakanaev Общие вопросы Delphi 1 23.10.2012 17:24
Работа с COM-портом Georgios Общие вопросы Delphi 12 28.09.2010 10:31
Работа с com портом Валера777 Assembler 4 05.12.2009 01:06
Работа с COM-портом jovanny Помощь студентам 2 03.05.2009 18:06
Работа с COM портом hoba Общие вопросы Delphi 3 20.11.2008 04:39




04:48.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Покупайте на сайте www.skinon.ru уникальные чехлы и наклейки для телефонов.
купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru