powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM библиотека для работы с высокоскоростным RS-232 портом
24 сообщений из 24, страница 1 из 1
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699432
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с проблемой при работе с SerialPort в C#. Идет большой поток данных через USB COM порт (более 1 мегабайта в секунду) и шарповый класс просто не успевает его принимать и обрабатывать. Часть данных теряется, видимо из-за переполнения буфера в самом порту. Поэтому хочу переписать код для приема данных из порта на неуправляемом коде + большой кольцевой буфер. Все это оформить в виде COM DLL на плюсах. Когда приходит очередная порция данных, бибилиотека должна генерировать событие и должна обеспечивать доступ к своему буфера, чтобы шарповый код мог в любой момент забрать накопленные там данные.
В общем может кто-то уже видел/делал такой велосипед? Из платных я наткнулся только на это но там все ссылки битые.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699452
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt Поэтому хочу переписать код для приема данных из порта на неуправляемом коде + большой кольцевой буфер.Что мешает это сделать на самом C# ?
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699470
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Eolt Поэтому хочу переписать код для приема данных из порта на неуправляемом коде + большой кольцевой буфер.Что мешает это сделать на самом C# ?

Видимо JIT, GC мешают. Не может шарповый код на такой скорости данные принимать и парсить в нем пакеты с данными. 7000 пакетов в секунду приходит где-то.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699495
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eoltkealon(Ruslan)пропущено...
Что мешает это сделать на самом C# ?

Видимо JIT, GC мешают. Не может шарповый код на такой скорости данные принимать и парсить в нем пакеты с данными. 7000 пакетов в секунду приходит где-то.
т.е. сделать всё что вы описали, т.е. "разделить чтение в кольцевой буфер" и "парсинг из буфера" вы уже попробовали и всё так же плохо?
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699535
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltСтолкнулся с проблемой при работе с SerialPort в C#. Идет большой поток данных через USB COM порт (более 1 мегабайта в секунду) и шарповый класс просто не успевает его принимать и обрабатывать. Часть данных теряется, видимо из-за переполнения буфера в самом порту. Поэтому хочу переписать код для приема данных из порта на неуправляемом коде + большой кольцевой буфер. Все это оформить в виде COM DLL на плюсах. Когда приходит очередная порция данных, бибилиотека должна генерировать событие и должна обеспечивать доступ к своему буфера, чтобы шарповый код мог в любой момент забрать накопленные там данные.
В общем может кто-то уже видел/делал такой велосипед? Из платных я наткнулся только на это но там все ссылки битые.

Мне кажется, это твои девичьи фантазии всё.
Тебе надо для начала очень хорошо выяснить, почему теряются данные в USB ...
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699741
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Eoltпропущено...


Видимо JIT, GC мешают. Не может шарповый код на такой скорости данные принимать и парсить в нем пакеты с данными. 7000 пакетов в секунду приходит где-то.
т.е. сделать всё что вы описали, т.е. "разделить чтение в кольцевой буфер" и "парсинг из буфера" вы уже попробовали и всё так же плохо?

Да, отдельный проект в солюшене, это шарповая сборка которая занимается получением сырых данных из порта.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699743
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Устройство слишком быстро пишет в COM порт, порядка 7000 пакетов в секунду, каждый пакет по 162 байта. Объем данных можешь посчитать сам. Объем буфера в COM порте 4096 байт. Прежде чем шарповый код прочитает данные из буфера порта, он оказывается уже много раз переполненным и перезаписанным.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699770
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltMasterZiv,

Устройство слишком быстро пишет в COM порт, порядка 7000 пакетов в секунду, каждый пакет по 162 байта. Объем данных можешь посчитать сам. Объем буфера в COM порте 4096 байт. Прежде чем шарповый код прочитает данные из буфера порта, он оказывается уже много раз переполненным и перезаписанным.хм
тогда проблема в планировщике задач, он просто не так часто переключает время на твой процесс, скорее всего с сишным кодом будет тоже самое.

надо копать в сторону DMA
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699784
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)EoltMasterZiv,

Устройство слишком быстро пишет в COM порт, порядка 7000 пакетов в секунду, каждый пакет по 162 байта. Объем данных можешь посчитать сам. Объем буфера в COM порте 4096 байт. Прежде чем шарповый код прочитает данные из буфера порта, он оказывается уже много раз переполненным и перезаписанным.хм
тогда проблема в планировщике задач, он просто не так часто переключает время на твой процесс, скорее всего с сишным кодом будет тоже самое.

надо копать в сторону DMA
+1

4096 / (162 * 7000) = 0.0036 сек., т.е. буфер заполняется за 3.6 мс, т.е. твоя прога не должна прерываться более чем на 3.6 мс, а диспетчер потоков виндовса выделяет кванты по 10 мс, т.е. чуть загрузили проц и пошли потери данных.

Как вариант: (можно на C#) вынести чтение порта в отдельный EXE, при запуске повышать приоритет до максимального там цикл чтения из порта и отправка в TCP-соединение. Далее другим процессом спокойно читай TCP и парси.

В остальном ничего особенного нет. Поток данных 1.1 Мб/сек это немного, тут не требуется каких-то сверхскоростных обработчиков. Проблема только в маленьком буфере COM порта.

PS Погугли, может размер буфера можно поменять.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699793
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eolt,

как так себе вариант - https://habr.com/company/intel/blog/186998/ , для проверки только
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699797
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EoltОбъем буфера в COM порте 4096 байт. Прежде чем шарповый код прочитает данные из буфера
порта, он оказывается уже много раз переполненным и перезаписанным.

Во-первых, объём буфера регулируется через SetupComm. В отличии от железных UART софтовая
эмуляция не ограничена в размерах.
Во-вторых, при переполнении буфера посылается сигнал источнику о приостановке передачи и
нормальные устройства его распознают.
В-третьих, может, стоит выкинуть прокладку в виде СОМ-эмулятора и работать непосредственно
через USB? Для внешних USB винтов, например, никаких проблем с приёмом/передачей не
наблюдается и на гораздо большей скорости.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699832
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

с внешними USB винтами DMA работает, а не ЦП
и управление сделано на уровне драйверов, для хз какого устройства естественно драйвер самому клепать нужно
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699839
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)с внешними USB винтами DMA работает, а не ЦП

Хочешь сказать, что внешний винт как-то насквозь проходит весь южный мост и напрямую
выходит на шину памяти? Что-то я сильно сомневаюсь в этом...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699859
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

КОМ порты не рассчитаны на такие скорости (10Мбит).
Вероятно, есть отдельный УСБ-АПИ.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699864
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglКОМ порты не рассчитаны на такие скорости (10Мбит).

Реальные UART, конечно, нет. Но у виртуального кома там от кома только название
устройства, которое надо пихать в CreateFile(). Чисто старые программы хоть как-то с этим
могли работать. Ну и нубам это проще, чем код типа такого:
Код: sql
1.
2.
3.
LPCWSTR path = 
L"\\\\?\\USB#VID_0483&PID_2434#6&26c545a4&0&1#{4d36e979-e325-11ce-bfc1-08002be10318}";
hFile = CreateFile(path, 0, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699866
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovХочешь сказать, что внешний винт как-то насквозь проходит весь южный мост и напрямую
выходит на шину памяти? Что-то я сильно сомневаюсь в этом...
ну почти

авторКонтроллер DMA - Используется для уменьшения нагрузки на центральный процессор в случае длительного обмена большим потоком данных с устройствами.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699883
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DMA-контроллеры сдохли где-то во времена Pentium.
Сейчас используется условный bus-mastering.
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39699912
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем,
Eoltшарповый класс просто не успевает его принимать и обрабатывать

Для начала выкинь этот класс и попробуй читать обычными функциями ввода-вывода в большие
буфера. Если чтение будет успевать - будешь решать как ускорить и распараллелить обработку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39700373
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDMA-контроллеры сдохли где-то во времена Pentium.
Сейчас используется условный bus-mastering.эт тоже самое, просто маркетинг

Dimitry SibiryakovВ общем,
Eoltшарповый класс просто не успевает его принимать и обрабатывать

Для начала выкинь этот класс и попробуй читать обычными функциями ввода-вывода в большие
буфера. Если чтение будет успевать - будешь решать как ускорить и распараллелить обработку.
почти гарантировано тоже самое выйдет - ибо причина никуда не денется, но попробовать конечно, никто не мешает
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39700380
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

т.е., например, хапанул ты в буфер
тут "вдруг" системный таймер нашу задачку отстранил от выполнения, и досвидос на время которого хватит что бы буфер переполнился
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39700453
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovEoltОбъем буфера в COM порте 4096 байт. Прежде чем шарповый код прочитает данные из буфера
порта, он оказывается уже много раз переполненным и перезаписанным.

Во-первых, объём буфера регулируется через SetupComm. В отличии от железных UART софтовая
эмуляция не ограничена в размерах.
Во-вторых, при переполнении буфера посылается сигнал источнику о приостановке передачи и
нормальные устройства его распознают.
В-третьих, может, стоит выкинуть прокладку в виде СОМ-эмулятора и работать непосредственно
через USB? Для внешних USB винтов, например, никаких проблем с приёмом/передачей не
наблюдается и на гораздо большей скорости.


Дмитрий, там разве не синхронный обмен с USB идёт?
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39700726
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДмитрий, там разве не синхронный обмен с USB идёт?там что угодно может быть, всё от устройства зависит

в данном случае, скорее всего, примитивные АЦП-ки c 10-ка датчиков постоянно лупят измерения - очень на наши универские лабы похоже, внешне только частоту настроить можно
но это, только, Eolt прояснить может
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39700978
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovDMA-контроллеры сдохли где-то во времена Pentium.
Сейчас используется условный bus-mastering.С какого перепугу?
http://www.xilinx.com/support/documentation/application_notes/xapp1052.pdf
...
Рейтинг: 0 / 0
COM библиотека для работы с высокоскоростным RS-232 портом
    #39700986
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое ощущение, что у ТС'а конвертер USB не на RS-232, а на RS-485, где нет никаких CTS/RTS.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / COM библиотека для работы с высокоскоростным RS-232 портом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]