реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Работа с COM портом с++ builder, Есть небольшие проблемы при работе своего устройства с СОМ
AlexRayne
сообщение Nov 17 2016, 17:05
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(k155la3 @ Nov 17 2016, 13:16) *
А если в Win таки реализовывать. Какой порядок (размер) таймаутов можно использовать ?

таймауты 5мс (банальным sleep ом) - там получаются вполне нормально, но нестабильно - будут время от времени вылезать 15-20мс паузы. если вы повысите приоритет задачи - то возможно удасться избавиться от таких выпадений. в этом плане линух оказался менее предсказуемым (ядро 2й версии) - там непредсказуеые лаги я получал по 50мс.
если будете пользоваться настройками DCD как вам выше расписали - то они реализуются скорее всего ядром, и разрешение 1мс они вполне реализуют.
для засекания времени нужны не таймауты а измерение времени - эта штука гораздо более проворная и малозатратная. для точного засекания времени у венды тоже есть стандартные средства, и вы найдете пачку библиотек и примеров типа Ultra High Precision Timing для венды.

Цитата
Мне это танцы с бубном надоели, думаю делать внешний "буферизатор" на контроллере, обеспечивающий
требуемый реалтайм для фрейминга, а для "закачки" в PC задействовать CTS-RTS.
Это правильное решение ?

чем городить такое лучше поправить протокол - для этого не нужно городить железо, и оно будет надежно работать почти везде. неужели невозможно ввести маркер заголовка?
CTS-RTS вам поможет мало. лучше посмотрите в сторону линии DTR-DSR - кажется они дают прерывание и можно повесить обработчик этого события. но вы покладете комп на обработку этих прерываний если они будут лететь интенсивно, а судя по размеру ваших пакетов - они будут свистеть интенсивно. - на вендовой (да и на линуховой) машине гораздо быстрее будет работать обмен с маркером чем с прерыванием.
Go to the top of the page
 
+Quote Post
Diko
сообщение Nov 17 2016, 17:55
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 114
Регистрация: 14-08-07
Из: Харьков, Украина
Пользователь №: 29 773



Цитата(k155la3 @ Nov 17 2016, 10:05) *
без претензий на звание специалиста sm.gif
--


Абсолютно !!! Я ни разу не претендую на звание специалиста, всязи с чем и задаю этот малоинтересный местному сообществу вопрос.

Цитата(k155la3 @ Nov 17 2016, 10:05) *
Вам правильно подсказывают насчет таймаутов.
Каким бы компонентом Вы не пользовались, они (скорее всего) в конечном итоге делает ситемный вызво ReadFile()
или ReadFileEx() и подготавливает блок DCB - структура управления-настройками СOM-порта, а также COMMTIMEOUT структура.

Это понятно, что так оно и есть. Была даже идея заморочится самостоятельно разбираться с АПИ и т.д. Хоть и понятно что знани для этого прямо скажем совсем мало... Но общее представление о работе с компортом я получил.

Цитата(k155la3 @ Nov 17 2016, 10:05) *
Так вот, если компонента позволяет настраивать эти таймауты - проблем не будет. Если же нет - Вы не сможете обеспечить
надежный и быстрый обмен в Вашим устройством, а таймауты (они потребуются в любом случае) придется организовывать самому.
Я использую прямой вызов ReadFile() с настройкой DCB. Устойчиво принимаются на PC пакеты от моего
девайса на 57600 c межпакетной паузой 50 мс

Компонент позволяет настраивать какие-то таймауты - какие и как достоверно не разбирался пока что.

Цитата(k155la3 @ Nov 17 2016, 10:05) *
По этой теме есть хорошая книжка Агурова, там есть описание всей низкоуровневой "кухни" работы с компортами.

На данный момент занимаюсь более углублённым изучением этой книги.




--------------------
Жизнь сложна и не предсказуема, незачем её усложнять.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 17 2016, 19:12
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (AlexandrY @ Nov 17 2016, 12:19) *
Начались старые байки.
Надо думать что TCP/IP под Windows весь построенный на таймерах мне приснился. biggrin.gif

Нет, Все еще хуже sad.gif. Вам приснилось, что Вы знаете, что такое уровень TCP/IP. TCP/IP вообще не занимается фреймингом, проблемы которого здесь вылезли. В описании протокола TCP/IP вообще нет ни одного слова таймер за ненадобностью.
Сюрприз!

QUOTE (k155la3 @ Nov 17 2016, 13:15) *
TCP/IP по большей части шас живет на Ethernet, а 90 процентов вопросов "пакетизации" выполняет контроллер.
SLIP - если в этом смысле - то да.

1) Не 90, а ровно 100%
2) Ни SLIP, ни PPP тоже НЕ используют таймауты для выделения фрейма.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Diko
сообщение Nov 17 2016, 19:38
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 114
Регистрация: 14-08-07
Из: Харьков, Украина
Пользователь №: 29 773



Цитата(zltigo @ Nov 17 2016, 11:43) *
В огороде бузина, а в Киеве дядька - у "любого" протокола таймауты это обязательные АВАРИЙНЫЕ ветки. Использование таймаутов для фрейминга, это фича УБОГИХ протоколов. Использование убогих протоколов с таймаутами для фрейминга в системах типа Windows не имеющих поддержки реального времени есть 100% махровая любительщина sad.gif. Так что протокол менять однозначно, а не бороться до конца жизни с тем, что надежный фреймиг по небольшим таймаутам под Win нереализуем в принципе.

ЭЭхххх, даже не могу ничего возразить - просто потому что "протокол" это очень громко сказано, и определение УБОГИЙ вполне себе подходит. Никогда до этого не сталкивался с организацией передачи данных между устройством и ПК. Посему и наступил на эти грабли. В связи с тем что само по себе устройство не весть что, думал как-то обойтись малой кровью точнее малыми трудозатратами. Т.е. раз в интервал времени сформировать пакет и отправить его на ПК, а уже на стороне ПК всё это собрать. Скорость передачи не имеет большого значения - не первостепенная задача. Сейчас у меня передача 32кБ занимает около 5 минут, меня это вполне устраивает. Чтение данных в таком объёме предполагается раз в месяц в лучшем случае, а то и реже. От скорости передачи СОМ это не зависит, скорость ограничена именно интервалами отправки пакетов. т.е. и на 9600 и на 115200 время передачи занимает одинаковое.
И да это любительщина эпитеты к слову любительщина можно подбирать самостоятельно и долго, я с ними согласен.
В данном проекте я наступил на идиологические грабли. Сделать сейчас как-нибудь чтобы побыстрее, а потом уж переделаю как надо... Сам за такое "вжаривал".
Протокол менять... Ну, менять можно то что есть и работает sm.gif Сейчас вобщем-то ничего нет. Что вы порекомендуете ? Как изменить протокол и как его реализовать ?


Цитата(AlexRayne @ Nov 17 2016, 20:05) *
чем городить такое лучше поправить протокол - для этого не нужно городить железо, и оно будет надежно работать почти везде. неужели невозможно ввести маркер заголовка?
CTS-RTS вам поможет мало. лучше посмотрите в сторону линии DTR-DSR - кажется они дают прерывание и можно повесить обработчик этого события. но вы покладете комп на обработку этих прерываний если они будут лететь интенсивно, а судя по размеру ваших пакетов - они будут свистеть интенсивно. - на вендовой (да и на линуховой) машине гораздо быстрее будет работать обмен с маркером чем с прерыванием.


Да можно ввести и маркеры, сейчас над этим и думаю. Пакеты коротки не потому что они идут с большой скоростью, а просто так сложилось ....
Без особых на причин. 32кб передаются около 5 минут.


--------------------
Жизнь сложна и не предсказуема, незачем её усложнять.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Nov 17 2016, 19:50
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(Diko @ Nov 17 2016, 22:38) *
И да это любительщина эпитеты к слову любительщина можно подбирать самостоятельно и долго, я с ними согласен.
В данном проекте я наступил на идиологические грабли. Сделать сейчас как-нибудь чтобы побыстрее, а потом уж переделаю как надо... Сам за такое "вжаривал".
Протокол менять... Ну, менять можно то что есть и работает sm.gif Сейчас вобщем-то ничего нет. Что вы порекомендуете ? Как изменить протокол и как его реализовать ?

Протокол с байт-стаффингом. Ищите:
Wake
Ридико Леонид Иванович

Примеры кода там выложены..


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
Diko
сообщение Nov 17 2016, 20:15
Сообщение #21


Частый гость
**

Группа: Свой
Сообщений: 114
Регистрация: 14-08-07
Из: Харьков, Украина
Пользователь №: 29 773



Спасибо. Буду поизучать в этом направлении.


--------------------
Жизнь сложна и не предсказуема, незачем её усложнять.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 17 2016, 20:36
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (iosifk @ Nov 17 2016, 21:50) *
Протокол с байт-стаффингом. Ищите:
Wake

Если без дополнительной скорее всего не нужной шелухи, то останется просто SLIP https://tools.ietf.org/html/rfc1055



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Nov 17 2016, 20:46
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Ага. я тоже за SLIP RFC1055.
обрамил кодом команды в начале и CRC16 в конце - и вперед.
очень нравится.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 18 2016, 07:55
Сообщение #24


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Diko @ Nov 17 2016, 21:38) *
Как изменить протокол и как его реализовать ?


В AsyncPro этих протоколов уже есть как собак нерезаных.
Простейший путь кинуть на форму компонент ApdDataPacket
Прикрепленное изображение


Настраиваете признаки начали и конца пакета и перехватываете ивент OnPacket.
И получаете готовый всегда собранный пакет.
Если ошибка, то получаете ивент OnTimeout

Читайте APRO_ReferenceGuide.pdf стр. 141
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 18 2016, 10:22
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(AlexRayne @ Nov 17 2016, 20:05) *
. . . .
( 1) чем городить такое лучше поправить протокол - для этого не нужно городить железо, и оно будет надежно работать почти везде. неужели невозможно ввести маркер заголовка?

(2) CTS-RTS вам поможет мало. лучше посмотрите в сторону линии DTR-DSR - кажется они дают прерывание и можно повесить обработчик этого события.
. . . .

(1) - протокол бинарный, перадаются в том числе числа int_32, double(64), соотв-но маркер получится слегка длинноватый. Очевидно (8+1) байт.
Надо будет это осмыслить насчет целесообразности. Зато можно будет работать "потоком".
(2) спасибо за инф. Я тестилку делал на базе CTS-RTS, но по опросу. До прерываний будет время доберемся.





Цитата(Diko @ Nov 17 2016, 22:38) *
. . . .
Пакеты коротки не потому что они идут с большой скоростью, а просто так сложилось ....
. . . .


Если пакеты короткие (5-10-20 байт), можете использовать следующий изворот.

1. Все данные передаются как 7-битные (т.е. байт с нулевым старшим битом)
2. Все заголовки пакетов, концевики, и прочие служебные символы, требуемые для фрейминга, передаются
с установленным старшим битом.
3. Как впихнуть 8-битные данные в 7 бит ?
Очень просто. Сперва в виде байтов c очищенным D7 передаются разряды данных D0-D6.
Потом - все "непереданные" D7-биты данных пакуются в требуемое кол-во байт последовательно, в биты D0...D6
Длина тела пакета (данных) получается Data_len+(data_len/7) байт.

Недостаток - затраты времени на (рас)паковку и избыточность. Затраты RAM на всеэто.
Достоинства - поточный разбор, 128 возможных "служебных" кодов, включая старт/стоп пакета STX ETX

Go to the top of the page
 
+Quote Post
iosifk
сообщение Nov 18 2016, 10:48
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(k155la3 @ Nov 18 2016, 13:22) *
1. Все данные передаются как 7-битные (т.е. байт с нулевым старшим битом)
2. Все заголовки пакетов, концевики, и прочие служебные символы, требуемые для фрейминга, передаются
с установленным старшим битом.
3. Как впихнуть 8-битные данные в 7 бит ?
Очень просто. Сперва в виде байтов c очищенным D7 передаются разряды данных D0-D6.
Потом - все "непереданные" D7-биты данных пакуются в требуемое кол-во байт последовательно, в биты D0...D6
Длина тела пакета (данных) получается Data_len+(data_len/7) байт.

Недостаток - затраты времени на (рас)паковку и избыточность. Затраты RAM на всеэто.
Достоинства - поточный разбор, 128 возможных "служебных" кодов, включая старт/стоп пакета STX ETX

Это сложно и так делать не советую. Уж если передавать байт данных двумя посылками в линию, то передавайте его стандартными символьными кодами. А "возврат каретки + перевод строки" - это стандартный же разграничитель кадра. И можно работать с любой терминалкой...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 18 2016, 11:05
Сообщение #27


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(iosifk @ Nov 18 2016, 14:48) *
Это сложно и так делать не советую.

Если протокол текстовый, наподобие Modbus/Ascii - то да.
Если же бинарный, то эта комбинация (CrLf) может вылезти в любом поле данных.

Сообщение отредактировал k155la3 - Nov 18 2016, 11:06
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 18 2016, 11:10
Сообщение #28


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(k155la3 @ Nov 18 2016, 13:05) *
Если протокол текстовый, наподобие Modbus/Ascii - то да.
Если же бинарный, то эта комбинация (CrLf) может вылезти в любом поле данных.


Так кодировать надо Base64 и нечего не вылезет. biggrin.gif
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 18 2016, 11:26
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(AlexandrY @ Nov 18 2016, 15:10) *
Так кодировать надо Base64 и нечего не вылезет. biggrin.gif

По "многочисленным просьбам" трудящщыхся на клавиатуре, постановлением прав-ства, в байт был введен бит D8.
Этого должно хватить на ближайшие 10 лет. Далее придется вводить следующий. sad.gif



Go to the top of the page
 
+Quote Post
Diko
сообщение Nov 18 2016, 20:49
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 114
Регистрация: 14-08-07
Из: Харьков, Украина
Пользователь №: 29 773



Цитата(AlexandrY @ Nov 18 2016, 10:55) *
В AsyncPro этих протоколов уже есть как собак нерезаных.
Простейший путь кинуть на форму компонент ApdDataPacket

Читайте APRO_ReferenceGuide.pdf стр. 141


Сапсибо! Вариант решения возникшей проблемы


--------------------
Жизнь сложна и не предсказуема, незачем её усложнять.
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 6th July 2025 - 13:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01595 секунд с 7
ELECTRONIX ©2004-2016