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

Nebel

Пользователи
  • Posts

    9
  • Joined

  • Last visited

Информация

  • Пол
    Мужчина
  • Город
    Moscow
  • Интересы
    embedded systems

Nebel's Achievements

Новичок

Новичок (1/5)

0

Reputation

  1. Проблема решилась неожиданным образом: Оказалось что производитель железки выдал неправильный протокол для работы. На предъявляемые претензии говорил: "у нас все работает, на вашей стороне что-то", и понеслась чехарда с межсимвольными таймаутами... Словом, протокол поменяли, а клиентов предупредить забыли. Сейчас все прекрасно работает и с паузой в 30 мс. Еще раз спасибо за помощь и интерес к теме P.S. оффтоп: планируются ли драйвера для Uport1150 под Mac OS X? (пробовал использовать в WinXP запущенной в Parallels под Mac OS X: устройство не стартует, пишет "Код ошибки 10")
  2. Да, много у прибора таймаут ~5мс. Прикрепил архив с программкой. Спасибо!
  3. Спасибо за вариант (да, я в Москве). Попросил ребят из Питера протестировать CP-132. С их слов задержка уменьшилась до 14 мс.
  4. Подскажите плз, а с CP-132 такая задача разрешима или нет? (в наличии данных плат нет, а покупать их чтобы проверить не вариант). Спасибо.
  5. Жаль. Но в любом случае спасибо за информацию.
  6. Да, 8-9 мсек многовато Очевидно задержка действительно происходит на этапе "USB dev Driver" <-> "UART в MOXA". Буду ждать вашего ответа от тайваньских разработчиков. Спасибо.
  7. По вашему логу не видно чтобы менялся бит четности (все время 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. Спасибо за интерес к теме.
  8. Использую Uport 1150 в режиме RS-485 2w для связи с прибором, у которого синхронизация старта пакета происходит с помощью 9-бита (первый байт в кадре с установленным 9-м битов в "1", оставшаяся часть кадра с 9-м битом = "0"). Т.к. напрямую управлять 9-м битом нельзя, то управляю им с помощью бита четности. Для первого байта: DCB.Parity = MARKPARITY; После отправки перенастраиваем ком-порт с помощью: SetCommState(PortHandle, &DCB2); где: DCB2.Parity = SPACEPARITY; Смотрю осциллографом линию и все хорошо (9-бит падает как надо), только вот процедура реинициализации (SetCommState) занимает порядка 35-39 мс (!!!). И получается что между первым байтом и оставшимися байтами пакета огромная пауза (и естественно нижнее устройство отваливается по тайм-ауту). Тот же код с имеющимся на мат.плате ком-портом работает на "ура" (никаких пауз и задержек на линии). Чем лечить? Заранее спасибо.
×
×
  • Create New...