Nebel Posted October 18, 2010 Share Posted October 18, 2010 Использую Uport 1150 в режиме RS-485 2w для связи с прибором, у которого синхронизация старта пакета происходит с помощью 9-бита (первый байт в кадре с установленным 9-м битов в "1", оставшаяся часть кадра с 9-м битом = "0"). Т.к. напрямую управлять 9-м битом нельзя, то управляю им с помощью бита четности. Для первого байта: DCB.Parity = MARKPARITY; После отправки перенастраиваем ком-порт с помощью: SetCommState(PortHandle, &DCB2); где: DCB2.Parity = SPACEPARITY; Смотрю осциллографом линию и все хорошо (9-бит падает как надо), только вот процедура реинициализации (SetCommState) занимает порядка 35-39 мс (!!!). И получается что между первым байтом и оставшимися байтами пакета огромная пауза (и естественно нижнее устройство отваливается по тайм-ауту). Тот же код с имеющимся на мат.плате ком-портом работает на "ура" (никаких пауз и задержек на линии). Чем лечить? Заранее спасибо. Link to comment
Komantsev Posted October 21, 2010 Share Posted October 21, 2010 Добрый день, Тестировали с драйвером версии 1.6. Получилась задержка 8 мсек (протоколировалось утилитой portmon). Попробуйте запустить portmon при работе своего приложения. Или дать нам кусок реального кода, чтобы мы попробовали разобраться в причине задержки. Link to comment
Nebel Posted October 21, 2010 Author Share Posted October 21, 2010 Добрый день, Тестировали с драйвером версии 1.6. Получилась задержка 8 мсек (протоколировалось утилитой portmon). Попробуйте запустить portmon при работе своего приложения. Или дать нам кусок реального кода, чтобы мы попробовали разобраться в причине задержки. По вашему логу не видно чтобы менялся бит четности (все время None). У меня portmon тоже пишет все красиво: 0.0089 сек (даже если бы это было правдой, то все равно 9 мсек это очень много, для примера в протоколе Modbus межсимвольный таймаут 1.5char что при скорости 9600 = ~1.5 мсек, а между пакетами тайм-аут 3.5char = ~ 3.5мсек). Но получается что portmon пишет одно, а на физической линии другое. Попробуйте посмотреть линию осциллографом (portmon может писать что угодно, как не крути винда не RTOS и доверять времянке из portmon нельзя). Код инициализации DCB стуктур: dcb.DCBlength = sizeof(DCB); if(BuildCommDCB("baud=19200 parity=M data=8 stop=1",&dcb)==0) { print_string = "error dcb"; Synchronize(print); } dcb.fNull = false; dcb.XonLim = 80; dcb.XoffLim = 200; dcb.fParity = false; dcb1.DCBlength = sizeof(DCB); if (BuildCommDCB("baud=19200 parity=S data=8 stop=1",&dcb1)==0) { print_string = "error dcb1"; Synchronize(print); } dcb1.fNull = false; dcb1.XonLim = 80; dcb1.XoffLim = 200; dcb1.fParity = false; Инициализация COMMTIMEOUTS: ct.ReadIntervalTimeout = 20; ct.ReadTotalTimeoutMultiplier = 50; ct.ReadTotalTimeoutConstant = 15; Открытие COM-порта: HANDLE port; port = CreateFile("\\\\.\\COM24", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(port!=INVALID_HANDLE_VALUE) { SetupComm(port, 8192, 8192); SetCommTimeouts(port, &ct); SetCommState(port, &dcb); } Чтение/запись: BYTE TxBuffer[256]; BYTE RxBuffer[256]; DWORD NumByte; int i_cnt = 0; while(!Terminated) { //Инициализация и отправка 1-го байта, у которого PARITY = MARK SetCommState(port, &dcb); TxBuffer[0] = 0x81; WriteFile(port, TxBuffer, 1, &NumByte, NULL); Sleep(1); //Инициализация и отправка 2,3-го байта, у которых PARITY = SPACE SetCommState(port, &dcb1); TxBuffer[0] = 0x81; TxBuffer[1] = 0x81; WriteFile(port, TxBuffer, 2, &NumByte, NULL); //чтение ответа, т.к. проверяем посылку запроса эта часть кода не принципиальна для нас Sleep(50); NumByte = 0; ReadFile(port, RxBuffer, 1, &NumByte, NULL); if(++i_cnt==256) break; } Вышеприведенный код прекрасно работает на имеющемся на мат.плате COM-порте. Задержка между 1-м и 2,3-м байтами ~ 1мсек (метод проверки: осциллограф). В аттачменте скриншот portmon и страницы с инфо о драйвере (могу выслать скриншот экрана осциллографа). P.S. Спасибо за интерес к теме. Link to comment
Komantsev Posted October 22, 2010 Share Posted October 22, 2010 Вам спасибо за столь подробные описания :-) Я пообщаюсь непосредственно с тайваньскими разработчиками. Проблема в том, что раз уж даже portmon показывает 8~9 мсек, то вряд ли уже это значение можно уменьшить. Как я понял, для Вас и эти 8~9 мсек недопустимы. Боюсь, что это есть ограничение USB-устройств (ведь как ни крути, при использовании переходника USB-to-Serial мы говорим не о непосредственном изменении параметров через шину ISA или PCI, а о работе с внешним контроллером, который будет работать не так эффективно). Link to comment
Nebel Posted October 22, 2010 Author Share Posted October 22, 2010 Вам спасибо за столь подробные описания :-) Я пообщаюсь непосредственно с тайваньскими разработчиками. Проблема в том, что раз уж даже portmon показывает 8~9 мсек, то вряд ли уже это значение можно уменьшить. Как я понял, для Вас и эти 8~9 мсек недопустимы. Боюсь, что это есть ограничение USB-устройств (ведь как ни крути, при использовании переходника USB-to-Serial мы говорим не о непосредственном изменении параметров через шину ISA или PCI, а о работе с внешним контроллером, который будет работать не так эффективно). Да, 8-9 мсек многовато Очевидно задержка действительно происходит на этапе "USB dev Driver" <-> "UART в MOXA". Буду ждать вашего ответа от тайваньских разработчиков. Спасибо. Link to comment
Komantsev Posted October 28, 2010 Share Posted October 28, 2010 Добрый день, Сорри за поздний ответ. Вобщем, хороших новостей нет :-(. Говорят, это ограничение USB-чипсета. И уменьшить время переключения на UPort никак не удастся. Link to comment
Nebel Posted October 29, 2010 Author Share Posted October 29, 2010 Добрый день, Сорри за поздний ответ. Вобщем, хороших новостей нет :-(. Говорят, это ограничение USB-чипсета. И уменьшить время переключения на UPort никак не удастся. Жаль. Но в любом случае спасибо за информацию. Link to comment
Nebel Posted November 3, 2010 Author Share Posted November 3, 2010 Добрый день, Сорри за поздний ответ. Вобщем, хороших новостей нет :-(. Говорят, это ограничение USB-чипсета. И уменьшить время переключения на UPort никак не удастся. Подскажите плз, а с CP-132 такая задача разрешима или нет? (в наличии данных плат нет, а покупать их чтобы проверить не вариант). Спасибо. Link to comment
Komantsev Posted November 3, 2010 Share Posted November 3, 2010 По идее, на плате задача разрешима. Некоторые заказчики делают так, выставляя бит четности вручную. Чтобы не было дальнейших проблем, предлагаю дать Вам плату на тестирование на пару дней. (насколько я понимаю, Вы находитесь в Москве?) Link to comment
Nebel Posted November 8, 2010 Author Share Posted November 8, 2010 По идее, на плате задача разрешима. Некоторые заказчики делают так, выставляя бит четности вручную. Чтобы не было дальнейших проблем, предлагаю дать Вам плату на тестирование на пару дней. (насколько я понимаю, Вы находитесь в Москве?) Спасибо за вариант (да, я в Москве). Попросил ребят из Питера протестировать CP-132. С их слов задержка уменьшилась до 14 мс. Link to comment
Komantsev Posted November 8, 2010 Share Posted November 8, 2010 То есть всё равно для Вас не приемлимо? А можете прислать пример программы, с помощью которой тестируете? Попробуем у себя "прогнать" на разных платах. Link to comment
Nebel Posted November 9, 2010 Author Share Posted November 9, 2010 Да, много у прибора таймаут ~5мс. Прикрепил архив с программкой. Спасибо! Link to comment
Nebel Posted November 9, 2010 Author Share Posted November 9, 2010 Проблема решилась неожиданным образом: Оказалось что производитель железки выдал неправильный протокол для работы. На предъявляемые претензии говорил: "у нас все работает, на вашей стороне что-то", и понеслась чехарда с межсимвольными таймаутами... Словом, протокол поменяли, а клиентов предупредить забыли. Сейчас все прекрасно работает и с паузой в 30 мс. Еще раз спасибо за помощь и интерес к теме P.S. оффтоп: планируются ли драйвера для Uport1150 под Mac OS X? (пробовал использовать в WinXP запущенной в Parallels под Mac OS X: устройство не стартует, пишет "Код ошибки 10") Link to comment
Komantsev Posted November 11, 2010 Share Posted November 11, 2010 Спасибо за новости! :-) По поводу MacOS - к сожалению, пока нет поддержки. Надеюсь, что она появится в обозримом будущем (пока только тщательно уговариваем "головную" Моксе в Тайване на этот счет), поскольку периодически возникает такая потребность у пользователей. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now