Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Скорость виртуальных COM-портов

87
30 мая 2008 года
Kogrom
2.7K / / 02.02.2008
Суть проблемы.

Работаю с преобразователями USB->RS (MOXA UPort 1250I, UPort 1130). ОС – Windows XP. При установке драйвера создается виртуальный COM-порт с которым моя программа работает как с обыкновенным COM-портом.

При работе заметил такую вещь – при работе с моей программой нет разницы, какая скорость обмена по RS – 115200 килобит/с или 57600 килобит/ в секунду – все равно данные передаются со скоростью примерно 30000 килобит в секунду. То есть, где-то есть существенные задержки передачи: либо в моей программе ошибка, либо драйвер этого преобразователя интерфейсов такой, либо Windows XP задержки вносит.

Я б не стал валить вину на преобразователь или Windows XP, если б не было подтверждающего примера: надо было запрограммировать микросхему с помощью программатора с RS-232 интерфейсом. Решили попробовать программировать с помощью этого преобразователя. При этом было явно видно, что скорость программирования намного меньше, чем при программировании через родной COM-порт из ОС Windows 98. При чем программа программирования была одна и та же, и сделана, скорее всего, более опытными программистами, чем я.

Вопросы:
1. Получалось ли у кого-нибудь передавать информацию со скоростью, близкой к 115200 килобит/с при работе с виртуальными (или реальными) COM-портами в Windows XP? Тут важна не скорость обмена, а трафик, то есть, сколько реально данных было передано в секунду.

2. Есть ли какой-нибудь способ замерить реально достижимую скорость передачи? Может есть какая-нибудь известная программа для обмена по RS-232, которая позволяет это сделать?
1.6K
30 мая 2008 года
Vov4ick
476 / / 01.02.2007
Скорость передачи устанавливается для одного байта. Если между байтами есть задержки, средняя скорость конечно будет меньше. Программно замеряется конечно средняя скорость. Задержки вызваны тем, что программатор и программируемая МС работают не мгновенно, возможно также программатор преобразует последовательный код в параллельный для записи в МС, ожидает готовность МС, с чем и связана задержка. Посмотреть мгновенную скорость передачи можно осциллографом, но я не вижу причин не верить устанавливаемой скорости.
Зачем использовать виртухайный порт, если есть реальный? Преобразователи УПШ->С1 не могут в принципе нормально работать, т.к. по стандарту должны выдавать напряжение низкого уровня не менее -12В, а высокого - не менее +12В. Поэтому далеко не все устройства с ними работают.
87
30 мая 2008 года
Kogrom
2.7K / / 02.02.2008
Vov4ick, реального порта у меня нет. Программатор используется на другом компьютере, стационарном. А тут решили проверить, как будет он работать с преобразователем USB->RS, который подсоединен к ноутбуку.

Но дело в другом. Я не могу понять, почему при изменении скорости обмена с 115200 килобит/с до 57600 килобит/с – количество данных в секунду передается такое же.

Может дело в моей программе, но найти причину не могу, поэтому пытаюсь определить, нет ли причины в чем-то другом. А преобразователь USB->RS MOXA UPort 1250I должен работать нормально, ибо промышленного назначения.
391
30 мая 2008 года
Archie
562 / / 03.02.2005
А ты пробовал тестировать свой преобразователь с другими устройствами? Можешь сделать просто loopback (замкнуть ножки 2 и 3 на DB9) и посмотреть скорость обмена. Посмотри осциллографом, меняется ли битрейт вообще.
87
31 мая 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Archie
А ты пробовал тестировать свой преобразователь с другими устройствами? Можешь сделать просто loopback (замкнуть ножки 2 и 3 на DB9) и посмотреть скорость обмена. Посмотри осциллографом, меняется ли битрейт вообще.


Осциллографом смотрел - битрейт меняется. loopback не делал, но так как этот преобразователь двухпортовый, то я замыкал между собой 2 выхода. Скорость передачи трафика при этом еще уменьшается. Но это понятно - в этом случае системе уже 2 элемента, вносящих задержки.

Однако, все пытаются помочь мне решить проблему, но никто не отвечает на 2 вопроса которые я задал в конце :)

551
31 мая 2008 года
Pavia
357 / / 22.04.2004
Цитата:
Но дело в другом. Я не могу понять, почему при изменении скорости обмена с 115200 килобит/с до 57600 килобит/с – количество данных в секунду передается такое же.


Тут дело такое. Виртуальный порт может не реагировать на изменение скорости. Но если ты работаешь с переходником, то тут все должно меняться.


1. Таймер замути, и померь сколько времени прошло сколько данных отправилось.


PS. А вообще с COM портом полный разброд, никто стандарты даже и не думает соблюдать.

87
31 мая 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Pavia
1. Таймер замути, и померь сколько времени прошло сколько данных отправилось.



А как я по вашему замерил, что передается примерно 30 килобит/с?

Вообще, я немного неправильно назвал тему, что, наверно, сбивает людей. Порт не абсолютно виртуальный - железо есть, но оно подключено к USB-входу. А драйвер железа заставляет операционную систему "думать", что подключен COM-порт, благодаря чему с этим железом могут работать программы, предназначенные для передачи по COM-порту.

391
31 мая 2008 года
Archie
562 / / 03.02.2005
Я тебе отвечу.
1. Передавал на скорости до 1Мбита (использовал FTDI), 1mbps - 500kbps на AVR USB (http://www.obdev.at/products/avrusb/index.html)
2. Сделай loopback на порту и посмотри.
41K
25 июня 2008 года
Max_Fly
2 / / 25.06.2008
Вопросы:
1. Получалось ли у кого-нибудь передавать информацию со скоростью, близкой к 115200 килобит/с при работе с виртуальными (или реальными) COM-портами в Windows XP? Тут важна не скорость обмена, а трафик, то есть, сколько реально данных было передано в секунду.

конечно удавалось. При работе с реальным портом - это не слишком большая проблема.

2. Есть ли какой-нибудь способ замерить реально достижимую скорость передачи? Может есть какая-нибудь известная программа для обмена по RS-232, которая позволяет это сделать?

программы такой я не знаю, но при работе через USB преобразователь всё очень сильно зависит от мощности процессора и загрузки системы. Можете проверить например так: запустите на одноядерной машине упаковку большого объёма данных например RARом и скорость передачи данных ещё упадёт при том же битрейте. Особенность USB заключается в том, что само по себе устройство инертно, и не может ничего передать компьютеру (хосту) без предварительного запроса со стороны хоста. Преобразователи имеют как правило на борту буферы, чтобы нивелировать эту особенность интерфейса. Чем больше буфер - тем менее устройство подвержено зависимости от загрузки системы, но тем менее оно realtime. Конечное устройство могло ответить, но его ответ "застрял" в буфере и программа принимает решение о тайм-ауте, неисправности и т.п. Применение таких переходников требует очень хорошей синхронизации "запрос ответ", поскольку не редкость получить после тайм-аута и очередного запроса ответ на предыдущий свой запрос.

Чтобы замерить реально достижимую скорость передачи данных, надо загрузить "пустой" компьютер, в котором выключено всё что можно. Необходимо замкнуть порт сам на себя, и написать код, устанавливающий для себя высокий приоритет и запускающий 2 потока. Один поток передаёт большой массив данных второй тут же принимающет его обратно (выводы 2-3 замкнуть при этом на преобразователе). установить барьер который достигают оба потока после того как выполнят свои действия. засекать время между запуском первого (передающего потока) достижением барьера вторым потоком.
Это как я себе вижу.

Реально для себя я оцениваю скорость передачи всегда в потоковом режиме. Использую Моха утилиту, и бесконечно передаю один и тот же символ (я люблю символы типа 0хАА или 0х55 - они хорошо различимы на экране осциллографа). На экране осциллографа наблюдаю паузы между стоповым битом (1) одного байта и стартовым битом (0) второго байта. Реальная скорость передачи равна (битрейт\10)*(период между байтами\длительность байта с стартовым и стоповым битами) - это конечно при расчёте 8 бит без чётности и 1 стоповый.

Если запуск на полностью облегчённой машине даёт пропуски между байтами - это признак некачественного железа преобразователя, некачественного микросхемы хоста на материнской плате, некачественно выполненного драйвера устройства (например некорректно обрабатывается аппаратный буфер в самом преобразователе) или некачественно выполненный драйвер хоста. Один и тот же преобразователь не может гарантировать одну и ту же скорость передачи информации на разных чипсетах и разных компьютерах, в отличие от аппаратного порта. Поэтому лично я противник использования такого рода преобразователей в сколь нибудь приличной аппаратуре (и очень скептически смотрю на "промышленность" такого рода преобразователей), хотя признаю, что для себя, для наладки, для обслуживания (для мест некритичных) очень удобно, особенно при необходимости выехать в тьму тараканью с ноутбуком.

для Vov4ick
Скорость передачи устанавливается для одного байта.

ИМХО скорость устанавливается в БОДах. Так что речь идёт даже не о бите.

Преобразователи УПШ->С1 не могут в принципе нормально работать, т.к. по стандарту должны выдавать напряжение низкого уровня не менее -12В, а высокого - не менее +12В. Поэтому далеко не все устройства с ними работают.

ИМХО С1 - это канальный интерфейс, наверное имелся в виду аналог рекомендации V.24 - С2?
ИМХО Вас кто-то обманул. В стандарте на стык С2 нет и намёка на электрические параметры. http://www.itn.ru/01/doc.php?id_nd=8 - вот ссылка на текст стандарта.
Электрические параметры описаны в V.28 (для несимметричного случая и в других рекомендациях, например V.10 V.11 для иных портов) что аналогично отечественному стандарту ГОСТ 23675-79

Явно стандарт не требует именно +\-12 вольт
По стандарту уровень логической единицы на входе приёмника должен быть меньше -3В а уровень логического нуля должен быть больше +3В.
в частности случай RS232 (C2) описан в разделе 4
http://protect.gost.ru/v.aspx?control=8&baseC=6&page=0&month=-1&year=-1&search=&id=146170&pageK=8D416AC8-8545-47F2-BDEC-10218714C12C

Лично я в этом стандарте не обнаружил упоминания о +\-12 В. Стандарт говорит о напряжении 5-15В по абсолютному значению. Если я ошибаюсь - пожалуйста, поправьте меня.

Потому утверждения авторов о том, что порты RS232 (С2) не удовлетворяют стандартам мне кажутся несколько необоснованными.

Всем спасибо за внимание, всем читателям форума удачи во всех их начинаниях!
87
17 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Похоже, я понял в чем была проблема - вероятно дело в используемой программе.

Программа работала следующим образом: чтение производилось в потоке. При этом я ожидал событие получения одного байта, затем проверял, сколько быйт доступно и если пришло требуемое количество - считывал данные.

Так вот теперь я грешу на функцию WaitForSingleObject(...). Вероятно, ожидание по этой функции длилось не точно до получения байта, а немного дольше. Это и вносило задержки, так как я запрашивал следующий кадр данных после прочтения текущего.

Для проверки я упростил программу: запустил в порт в одну сторону только передачу, а с другой стороны в потоке с определенным периодом (около 2 мс) только считывал все полученные байты в порту. При этом скорость по траффику как раз получилась около 115 кбит/с.
41K
17 июля 2008 года
Max_Fly
2 / / 25.06.2008
я нашёл в работе Титова.
Описано всё касаемо как раз Вашего случая.
h**p:// book-ua.org / FILES / electrotech / 26_12_2007 / electr01813.pdf

в ссылке убрать * и пробелы
87
18 июля 2008 года
Kogrom
2.7K / / 02.02.2008
Статья конечно интересная, но я ее уже видел. На мой взгляд - более полно и подробно работа с COM-портами расписана в книге П.Агурова "Последовательные интерфейсы ПК. Практика программирования".

Моя программа - аналог его примера работы с COM-портами с использованием потоков, только я перевел ее с Дельфи на си++. И все получается хорошо, кроме этих небольших задержек, о которых я говорил выше.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог