Jump to content
Форум по продукции MOXA

Uport 1150 и 9-битная передача


Recommended Posts

Использую 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

Добрый день,

 

Тестировали с драйвером версии 1.6. Получилась задержка 8 мсек (протоколировалось утилитой portmon).

Попробуйте запустить portmon при работе своего приложения. Или дать нам кусок реального кода, чтобы мы попробовали разобраться в причине задержки.

1.JPG

Link to comment

Добрый день,

 

Тестировали с драйвером версии 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.

Спасибо за интерес к теме.

post-1107-1287654677,4_thumb.jpg

post-1107-1287654683,08_thumb.jpg

Link to comment

Вам спасибо за столь подробные описания :-)

Я пообщаюсь непосредственно с тайваньскими разработчиками. Проблема в том, что раз уж даже portmon показывает 8~9 мсек, то вряд ли уже это значение можно уменьшить. Как я понял, для Вас и эти 8~9 мсек недопустимы.

Боюсь, что это есть ограничение USB-устройств (ведь как ни крути, при использовании переходника USB-to-Serial мы говорим не о непосредственном изменении параметров через шину ISA или PCI, а о работе с внешним контроллером, который будет работать не так эффективно).

Link to comment

Вам спасибо за столь подробные описания :-)

Я пообщаюсь непосредственно с тайваньскими разработчиками. Проблема в том, что раз уж даже portmon показывает 8~9 мсек, то вряд ли уже это значение можно уменьшить. Как я понял, для Вас и эти 8~9 мсек недопустимы.

Боюсь, что это есть ограничение USB-устройств (ведь как ни крути, при использовании переходника USB-to-Serial мы говорим не о непосредственном изменении параметров через шину ISA или PCI, а о работе с внешним контроллером, который будет работать не так эффективно).

Да, 8-9 мсек многовато :)

Очевидно задержка действительно происходит на этапе "USB dev Driver" <-> "UART в MOXA".

Буду ждать вашего ответа от тайваньских разработчиков.

 

Спасибо.

Link to comment

Добрый день,

Сорри за поздний ответ.

Вобщем, хороших новостей нет :-(. Говорят, это ограничение USB-чипсета. И уменьшить время переключения на UPort никак не удастся.

Link to comment

Добрый день,

Сорри за поздний ответ.

Вобщем, хороших новостей нет :-(. Говорят, это ограничение USB-чипсета. И уменьшить время переключения на UPort никак не удастся.

 

Жаль. Но в любом случае спасибо за информацию.

Link to comment

Добрый день,

Сорри за поздний ответ.

Вобщем, хороших новостей нет :-(. Говорят, это ограничение USB-чипсета. И уменьшить время переключения на UPort никак не удастся.

 

Подскажите плз, а с CP-132 такая задача разрешима или нет? (в наличии данных плат нет, а покупать их чтобы проверить не вариант).

Спасибо.

Link to comment

По идее, на плате задача разрешима. Некоторые заказчики делают так, выставляя бит четности вручную.

Чтобы не было дальнейших проблем, предлагаю дать Вам плату на тестирование на пару дней.

(насколько я понимаю, Вы находитесь в Москве?)

Link to comment

По идее, на плате задача разрешима. Некоторые заказчики делают так, выставляя бит четности вручную.

Чтобы не было дальнейших проблем, предлагаю дать Вам плату на тестирование на пару дней.

(насколько я понимаю, Вы находитесь в Москве?)

Спасибо за вариант (да, я в Москве). Попросил ребят из Питера протестировать CP-132. С их слов задержка уменьшилась до 14 мс.

Link to comment

То есть всё равно для Вас не приемлимо?

А можете прислать пример программы, с помощью которой тестируете? Попробуем у себя "прогнать" на разных платах.

Link to comment

Проблема решилась неожиданным образом:

Оказалось что производитель железки выдал неправильный протокол для работы. На предъявляемые претензии говорил: "у нас все работает, на вашей стороне что-то", и понеслась чехарда с межсимвольными таймаутами... Словом, протокол поменяли, а клиентов предупредить забыли. Сейчас все прекрасно работает и с паузой в 30 мс.

 

Еще раз спасибо за помощь и интерес к теме :)

 

 

P.S.

оффтоп: планируются ли драйвера для Uport1150 под Mac OS X? (пробовал использовать в WinXP запущенной в Parallels под Mac OS X: устройство не стартует, пишет "Код ошибки 10")

Link to comment

Спасибо за новости! :-)

 

По поводу MacOS - к сожалению, пока нет поддержки. Надеюсь, что она появится в обозримом будущем (пока только тщательно уговариваем "головную" Моксе в Тайване на этот счет), поскольку периодически возникает такая потребность у пользователей.

Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...