Задача. Через каждые 20-50 мс надо посылать по последовательному порту пакет контроллеру и получать от него ответный пакет. Длительность пакетов: 1 мс. Длина пакетов: около 10 байт.
Как грамотно реализовать: с помощью драйвера или можно клиентским приложением?
Посоветуйте какие-нибудь примеры
Здравствуйте OlegK1,
Посмотри CreateFile (Для Windows) это позволит работать с последовательным портом
SetCommState, GetCommState — установка параметров
ReadFile, WriteFile — работа с портом
Остальное смотри в MSDN
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте OlegK1, VK>Посмотри CreateFile (Для Windows) это позволит работать с последовательным портом VK>SetCommState, GetCommState — установка параметров VK>ReadFile, WriteFile — работа с портом VK>Остальное смотри в MSDN
А вот интересно для 2000-ых это тоже работает?
В свое время я столкнулся с такой проблемой под NT4.0. Порт не адекватно себя вел.
Щас собираюсь переходить с 98 на 2000 и опасаюсь этой проблемы. И причины уже есть: одна программка, написанная не мной, не работает . Хотя на НТ она работала! Может там установки какие-нить надо сделать?
Здравствуйте Amor,
Если тебя интересует очень точная работа (как в ДОС на низком уровне), то отключи буферизацию последовательных портов. Тогда все будет работать так как ты предполагаешь, вплоть до битов. Если будет буферизация, то точно можно предсказывать только поступление правильных данных, а вся дополнительная информация о портах будет не всегда предсказуемой, поскольку неизвестно к какому моменту времени относится (в буфер данные читаются независимо от твоих запросов на чтение), ведь Винды могут заносить в буфер ранее чем твоей проге это потребуется и поэтому она будет обращаться к буферу практически всегда. А разницы между NT W2k XP я не заметил. Одна и та же прога работала везде одинаково стабильно (и с буферизацией и без).
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте Amor, VK>Если тебя интересует очень точная работа (как в ДОС на низком уровне), то отключи буферизацию последовательных портов. Тогда все будет работать так как ты предполагаешь, вплоть до битов. Если будет буферизация, то точно можно предсказывать только поступление правильных данных, а вся дополнительная информация о портах будет не всегда предсказуемой, поскольку неизвестно к какому моменту времени относится (в буфер данные читаются независимо от твоих запросов на чтение), ведь Винды могут заносить в буфер ранее чем твоей проге это потребуется и поэтому она будет обращаться к буферу практически всегда. А разницы между NT W2k XP я не заметил. Одна и та же прога работала везде одинаково стабильно (и с буферизацией и без).
VK>С Уважением Краснокутский Василий
Все это относится к функции CreateFile? Я так понимаю об ассемблерных вставках речи и быть не может? И вопрос: как отключить буферизацию? и что подразумевается под дополнительной информацией в буфере?
Спасибо.
Здравствуйте Amor,
А смысл делать ассемблерные вставки, если все функции написаны на высоком уровне и при этом дают полную информацию о функционировании последовательного порта ?
Посмотри в MSDN раздел Communication Functions
CreateFile только создает поток с которым ты будешь работать, с таким же успехом она может открыть файл на чтение и запись ...
Это всего навсего команда дающая тебе доступ к потоку не более. Вся работа и установки для последовательного порта описана в разделе MSDN указанном выше ...
Отключать буферизацию следует не только на программном уровне, но и на уровне пользователя — Control Panel/System/Device Manager/Communication Port 1/Port Settings/Advanced/ Убрать галочку Use Fifo Buffers
Приведу пример, чтобы тебе было более понятно о чем идет речь:
//Инициализируем порт для работы
hPortHandle=(UINT)CreateFile ("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,NULL);
//Чтение из порта
ReadFile((HANDLE)hPortHandle,&CharRead,1,&nReadByte,NULL);
Запись в порт аналогично, только WriteFile
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте OlegK1, VK>Посмотри CreateFile (Для Windows) это позволит работать с последовательным портом VK>SetCommState, GetCommState — установка параметров VK>ReadFile, WriteFile — работа с портом VK>Остальное смотри в MSDN
А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?
Здравствуйте OlegK1, Вы писали:
OK>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?
Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте OlegK1, Вы писали:
OK>>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?
VK>Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно
Если своевременно не переписать первый байт пакета из порта в ОЗУ, то он будет затерт вторым байтом пакета и, таким образом, пакет корректно принят не будет.
Здравствуйте OlegK1, Вы писали:
OK>Задача. Через каждые 20-50 мс надо посылать по последовательному порту пакет контроллеру и получать от него ответный пакет. Длительность пакетов: 1 мс. Длина пакетов: около 10 байт. OK>Как грамотно реализовать: с помощью драйвера или можно клиентским приложением? OK>Посоветуйте какие-нибудь примеры
Есть еще один существенный вопрос: весь ли пакет передается с одинаковыми настройками COM-порта (кол-во start,stop,databits, parity, ...). Если в процессе их надо менять — будут проблемы.
Здравствуйте Dront, Вы писали:
D>Здравствуйте OlegK1, Вы писали:
OK>>Задача. Через каждые 20-50 мс надо посылать по последовательному порту пакет контроллеру и получать от него ответный пакет. Длительность пакетов: 1 мс. Длина пакетов: около 10 байт. OK>>Как грамотно реализовать: с помощью драйвера или можно клиентским приложением? OK>>Посоветуйте какие-нибудь примеры
D>Есть еще один существенный вопрос: весь ли пакет передается с одинаковыми настройками COM-порта (кол-во start,stop,databits, parity, ...). Если в процессе их надо менять — будут проблемы.
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте OlegK1, Вы писали:
OK>>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?
VK>Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно
Может ли клиентское приложение своевременно переписывать байты из порта в ОЗУ, если оно не может попросить у контроллера приостановить передачу пакета?
Здравствуйте OlegK1, Вы писали:
OK>>>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?
VK>>Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно
OK>Может ли клиентское приложение своевременно переписывать байты из порта в ОЗУ, если оно не может попросить у контроллера приостановить передачу пакета?
Какие нафиг "байты из порта в ОЗУ"? Ты ж с драйвером работаешь, а не с аппаратурой напрямую. Если тебя волнует, какого размера буфер используется драйвером, спроси об этом драйвер — GetCommProperties. Если одновременно с опросом конторллера в кваку не гонять, производительности даже первого пня за глаза хватит, чтоб десяток-другой компортов обслужить и выполнить любые разумные преобразования полученных данных.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
А все-таки у меня сейчас проблема: есть некая прога, написанная умными дядями , так вот под 98ые она работала. Установил себе 2000 и возникают проблемы. В чем может быть причина подскажите плз. Симтомы такие: видно, что передача идет, но контроллер не отвечает, а тут же перезагружаюсь в 98-ые — все нормально.
Спасибо!
Здравствуйте Amor, Вы писали:
A>А все-таки у меня сейчас проблема: есть некая прога, написанная умными дядями , так вот под 98ые она работала. Установил себе 2000 и возникают проблемы. В чем может быть причина подскажите плз. Симтомы такие: видно, что передача идет, но контроллер не отвечает, а тут же перезагружаюсь в 98-ые — все нормально. A>Спасибо!
А есть уверенность того, что эти умные дяди не жахают данные прямо по портам?
Здравствуйте Alex Smirnov, Вы писали:
AS>А есть уверенность того, что эти умные дяди не жахают данные прямо по портам?
Т.е. ? Что значит жахают? Но в любом случае, конечно, в этом нет уверенности, но программка сделана добротно, у фирмы есть ссылочка на свой сайт, вообщем все как положено!
Здравствуйте Amor, Вы писали:
A>Здравствуйте Alex Smirnov, Вы писали:
AS>>А есть уверенность того, что эти умные дяди не жахают данные прямо по портам?
A>Т.е. ? Что значит жахают? Но в любом случае, конечно, в этом нет уверенности, но программка сделана добротно, у фирмы есть ссылочка на свой сайт, вообщем все как положено!
Жахают — исползуют напрямую обращение по портам. т.е. _outp()/_inpt()/... или out dx,al
Под 9x виндами такие обращения выполняются, т.к. есть доступ к физическим устройствам компа.
Под NT версиями виндов такие обращения из аппликации игнорируються! т.к. собственно поэтому и были придуманы
интерфейсы драйверов, через которые такое можно делать.
Здравствуйте Alex Smirnov, Вы писали:
AS>Жахают — исползуют напрямую обращение по портам. т.е. _outp()/_inpt()/... или out dx,al AS>Под 9x виндами такие обращения выполняются, т.к. есть доступ к физическим устройствам компа. AS>Под NT версиями виндов такие обращения из аппликации игнорируються! т.к. собственно поэтому и были придуманы AS>интерфейсы драйверов, через которые такое можно делать.
Но видно ведь на входе контроллера данные какие-то есть! Нога дергается, как говорится! Значит комп данные передает. А вот не отвечает микросхема! Конечно, можно подумать, что с ней что-то неладное, но в 98-ых все нормально работает!
Здравствуйте Amor,
Единственный способ убедиться в том, что работает — вогнать осциллограф в порт на котором висит ваше устройство (вместо него или параллельно это неважно). Скорость передачи по порту ты знаешь (если нет, то подобрать недолго), следовательно засинхронизироваться сможешь. Включаешь программу, отправляешь данные и смотришь что твориться на осциллографе. Из этого можно понять работает ли программа вообще или нет ... Самое главное правильно воткнуть осциллограф, как это делается точно не помню (давно было), но если взять схему распайки выхода порта, то там сразу все станет понятно. Естественно вертикальную развертку вгоняешь на данные, а горизонталь на синхроимпульсы от порта.
После этого можно что-то утверждать, а так это пустой разговор получается.
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте Amor, VK>Единственный способ убедиться в том, что работает — вогнать осциллограф в порт на котором висит ваше устройство (вместо него или параллельно это неважно). Скорость передачи по порту ты знаешь (если нет, то подобрать недолго), следовательно засинхронизироваться сможешь. Включаешь программу, отправляешь данные и смотришь что твориться на осциллографе. Из этого можно понять работает ли программа вообще или нет ... Самое главное правильно воткнуть осциллограф, как это делается точно не помню (давно было), но если взять схему распайки выхода порта, то там сразу все станет понятно. Естественно вертикальную развертку вгоняешь на данные, а горизонталь на синхроимпульсы от порта. VK>После этого можно что-то утверждать, а так это пустой разговор получается.
VK>С Уважением Краснокутский Василий
Я так и делал. Только я не пытался уловить данные, к-рые там проходят, их не много, да и неизвестно какие они.
НО ФАКТ — ПОРТ КАК-ТО РАБОТАЕТ. Что-то там видно. Но контроллер не отвечает!!! 98-ым отвечает, а 2000-ым не отвечает, он что их как-то распознает? шутка!
Здравствуйте Amor,
Порт точно включен ? посмотри в Control Panel... там устройство работает нормально ?
Описываемое тобой это что-то удивительное, так не должно быть и как показывает практика не бывает... Может у тебя вообще порт не проинсталлялся, так бывает но очень редко (только если он сгорел особо зверским образом), но ведь твой не горелый похоже...
Может у тебя настройки порта разные (четность, количество инф. бит, скорость ....)
Попробуй написать простейшую программу для взаимодействия с контроллером и подбери настройки при которых контроллер отзывается на команды. Наверное это единственное что может помочь.
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте Amor, VK>Порт точно включен ? посмотри в Control Panel... там устройство работает нормально ? VK>Описываемое тобой это что-то удивительное, так не должно быть и как показывает практика не бывает... Может у тебя вообще порт не проинсталлялся, так бывает но очень редко (только если он сгорел особо зверским образом), но ведь твой не горелый похоже... VK>Может у тебя настройки порта разные (четность, количество инф. бит, скорость ....) VK>Попробуй написать простейшую программу для взаимодействия с контроллером и подбери настройки при которых контроллер отзывается на команды. Наверное это единственное что может помочь.
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Здравствуйте Amor, VK>Единственный способ убедиться в том, что работает — вогнать осциллограф в порт на котором висит ваше устройство (вместо него или параллельно это неважно). Скорость передачи по порту ты знаешь (если нет, то подобрать недолго), следовательно засинхронизироваться сможешь. Включаешь программу, отправляешь данные и смотришь что твориться на осциллографе. Из этого можно понять работает ли программа вообще или нет ... Самое главное правильно воткнуть осциллограф, как это делается точно не помню (давно было), но если взять схему распайки выхода порта, то там сразу все станет понятно. Естественно вертикальную развертку вгоняешь на данные, а горизонталь на синхроимпульсы от порта. VK>После этого можно что-то утверждать, а так это пустой разговор получается.
Суровый бред У человека явно софтовая, а не железячная проблема, осциллограф тут не при делах. Да и подавать на горизонтальную развертку синхроимпульсы (которых, кстати, в компортах не водится) вместо пилы — это ж надо придумать
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Sergey, .
S>Суровый бред Да и подавать на горизонтальную развертку синхроимпульсы (которых, кстати, в компортах не водится) вместо пилы — это ж надо придумать
Теоретически конечно надо подавать пилу, но я не помню чтобы у меня был генератор пилы. Я как-то по другому выходил из положения. А насчет синхроимпульсов может ты и прав, я уже не помню, но по моему они в порту есть, может только не в ярко выраженном виде
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:
VK>Теоретически конечно надо подавать пилу, но я не помню чтобы у меня был генератор пилы. Я как-то по другому выходил из положения.
Генератор пилы есть в любом осциллографе. И в подавляющем большинстве осциллографов синхровход этого генератора выведен наружу и предусмотрена возможность переключения внешний/внутренней синхронизации.
VK>А насчет синхроимпульсов может ты и прав, я уже не помню, но по моему они в порту есть, может только не в ярко выраженном виде
На разъеме компорта синхроимпульсов нет ни в каком виде. То, что есть — не является синхроимпульсами и может вообще не использоваться в некоторых режимах работы. При трехпроводном соединении, обычно применяемом для связи с контроллерами, ничего, кроме RxD, TxD и земли нет.
Да и вообще, работоспособность ком-порта куда проще мышкой проверить Ну или loopback-адаптером, если с паяльником дружишь.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте Amor, Вы писали:
A>Здравствуйте Vasiliy_Krasnokutsky, Вы писали: A>А вот интересно для 2000-ых это тоже работает? A>В свое время я столкнулся с такой проблемой под NT4.0. Порт не адекватно себя вел. A>Щас собираюсь переходить с 98 на 2000 и опасаюсь этой проблемы. И причины уже есть: одна программка, написанная не мной, не работает . Хотя на НТ она работала! Может там установки какие-нить надо сделать?
Я писал кое-что для синхронизации PalmOS через USB/COM. При правильной настройке последовательного порта (SetCommState) всё работало совершенно одинаково для Win98/NT/2000. Но вызов этой функции очень критичен, там очень много настроек, так что предварительно надо хорошенько разобраться, как последовательный порт работает. В MSDN это достаточно подробно описано.