|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
11.11.2016, 21:45 | #1 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
Работа с Com - портом
Пытаюсь работать с RS-232, ОС Windows 7.
Программа с периодом пару секунд пытается получить массив данных фиксированной длины, около 20 кБайт со скоростью 115200 бит/с. Для получения массива данных источнику информации высылается байт запроса. Режим - не overlay. Удается это сделать без сбоев с вероятностью ~94%. В случае сбоя как правило получается на десяток байт меньше (реже - на сотню). Вопрос: кто - нибудь пытался решить подобную задачу? Что получилось? |
11.11.2016, 22:47 | #2 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Использовать аппаратный контроль потока. Ибо виндоус эта не система реального времени, как следствие выход из таймера в 2 секунды может наступить и в 2٫25 с
Или программный контроль потока на XOn/XOff и начинать читать заранее и оканчивать чуть дольше, по моей статистики задержки между квантами исполнения потока не привыкают 250 мс.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
11.11.2016, 23:03 | #3 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
Мой метод прост: запрос - WriteFile, вызов ReadFile для считывания.
ReadFile приостанавливает мою программу до тех пор, пока не получит заданное количество байт, или не истечет время получения информации в соответствии с COMMTIMEOUTS. Пробовал вставлять Sleep(2000) между запросом и получением - на исход не повлияло. Разумеется, буфер приема информации установлен с запасом: 32768. Интересно, что если перед запросом вызвать Beep(400,1), например, то программа просто виснет. |
11.11.2016, 23:10 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
А что у нас в COMMTIMEOUTS?
А как DCB был заполнен? Последний раз редактировалось waleri; 11.11.2016 в 23:17. |
11.11.2016, 23:17 | #5 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
А чего только не перепробовано. Всего и не упомню. В общем, при недостаче данных, ждать выхода из ReadFile приходилось гораздо больше 2-х секунд.
Да, еще вот что: установлено достоверно, что первые 3 байта всегда передаются правильно, а где-то после первой трети массива наблюдается смещение элементов массива к началу на 88 байт, 80 байт, 8 байт... Данные не просто передаются не полностью - они искажаются. DCB: обмен байтами по 8 бит, без квитирования, без четности и прочих премудростей вроде обнаружения свободной линии и т.п. Последний раз редактировалось Dmitry_B; 11.11.2016 в 23:26. Причина: Вспомнил кое-что |
12.11.2016, 09:26 | #6 |
Форумчанин
Регистрация: 23.01.2016
Сообщений: 608
|
1- обсуждение сферического коня без кода в теме, что наворотил TC можно только догадываться как вычитываются и накапливаются данные
2- так как неизвестно время и таймаут приняли за 2 секунды, то в DCB параметр ReadTotalTimeoutConstant = 2000 3- если передающая сторона столь нестабильна и без битов контроля, то ReadIntervalTimeout = ReadTotalTimeoutMultiplier = MAXDWORD 4- таймер запроса данных увеличить до 3-4 секунд 5- лезть в VCL из потока чтения без синхронизе, и уж тем паче пихать туда sleep() верх невежества 6- где собственно протокол обмена с устройством? |
12.11.2016, 10:20 | #7 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
|
12.11.2016, 11:22 | #8 | |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
Цитата:
Вопрос был: кто-то что-то подобное делал? Что получилось? По п.5 - ничего не понял. Пояснить можно? |
|
12.11.2016, 11:27 | #9 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
|
12.11.2016, 12:50 | #10 | ||||
Форумчанин
Регистрация: 23.01.2016
Сообщений: 608
|
Цитата:
Цитата:
Цитата:
Цитата:
|
||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с 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 |