надо посылать по последовательному порту
От: OlegK1  
Дата: 16.09.02 08:52
Оценка:
Задача. Через каждые 20-50 мс надо посылать по последовательному порту пакет контроллеру и получать от него ответный пакет. Длительность пакетов: 1 мс. Длина пакетов: около 10 байт.
Как грамотно реализовать: с помощью драйвера или можно клиентским приложением?
Посоветуйте какие-нибудь примеры
Re: надо посылать по последовательному порту
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 08:58
Оценка:
Здравствуйте OlegK1,
Посмотри CreateFile (Для Windows) это позволит работать с последовательным портом
SetCommState, GetCommState — установка параметров
ReadFile, WriteFile — работа с портом
Остальное смотри в MSDN
Re[2]: надо посылать по последовательному порту
От: Amor Россия  
Дата: 16.09.02 09:56
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте OlegK1,

VK>Посмотри CreateFile (Для Windows) это позволит работать с последовательным портом
VK>SetCommState, GetCommState — установка параметров
VK>ReadFile, WriteFile — работа с портом
VK>Остальное смотри в MSDN

А вот интересно для 2000-ых это тоже работает?
В свое время я столкнулся с такой проблемой под NT4.0. Порт не адекватно себя вел.
Щас собираюсь переходить с 98 на 2000 и опасаюсь этой проблемы. И причины уже есть: одна программка, написанная не мной, не работает . Хотя на НТ она работала! Может там установки какие-нить надо сделать?

Спасибо!
Re[3]: надо посылать по последовательному порту
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 10:07
Оценка:
Здравствуйте Amor,
Если тебя интересует очень точная работа (как в ДОС на низком уровне), то отключи буферизацию последовательных портов. Тогда все будет работать так как ты предполагаешь, вплоть до битов. Если будет буферизация, то точно можно предсказывать только поступление правильных данных, а вся дополнительная информация о портах будет не всегда предсказуемой, поскольку неизвестно к какому моменту времени относится (в буфер данные читаются независимо от твоих запросов на чтение), ведь Винды могут заносить в буфер ранее чем твоей проге это потребуется и поэтому она будет обращаться к буферу практически всегда. А разницы между NT W2k XP я не заметил. Одна и та же прога работала везде одинаково стабильно (и с буферизацией и без).

С Уважением Краснокутский Василий
Re[4]: надо посылать по последовательному порту
От: Amor Россия  
Дата: 16.09.02 10:38
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте Amor,

VK>Если тебя интересует очень точная работа (как в ДОС на низком уровне), то отключи буферизацию последовательных портов. Тогда все будет работать так как ты предполагаешь, вплоть до битов. Если будет буферизация, то точно можно предсказывать только поступление правильных данных, а вся дополнительная информация о портах будет не всегда предсказуемой, поскольку неизвестно к какому моменту времени относится (в буфер данные читаются независимо от твоих запросов на чтение), ведь Винды могут заносить в буфер ранее чем твоей проге это потребуется и поэтому она будет обращаться к буферу практически всегда. А разницы между NT W2k XP я не заметил. Одна и та же прога работала везде одинаково стабильно (и с буферизацией и без).

VK>С Уважением Краснокутский Василий


Все это относится к функции CreateFile? Я так понимаю об ассемблерных вставках речи и быть не может? И вопрос: как отключить буферизацию? и что подразумевается под дополнительной информацией в буфере?
Спасибо.
Re[5]: надо посылать по последовательному порту
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 11:01
Оценка:
Здравствуйте 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

С Уважением Краснокутский Василий
Re[2]: надо посылать по последовательному порту
От: OlegK1  
Дата: 16.09.02 11:13
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте OlegK1,

VK>Посмотри CreateFile (Для Windows) это позволит работать с последовательным портом
VK>SetCommState, GetCommState — установка параметров
VK>ReadFile, WriteFile — работа с портом
VK>Остальное смотри в MSDN

А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?
Re[3]: надо посылать по последовательному порту
От: Vasiliy_Krasnokutsky Россия  
Дата: 16.09.02 11:29
Оценка:
Здравствуйте OlegK1, Вы писали:

OK>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?


Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно
Re[4]: надо посылать по последовательному порту
От: OlegK1  
Дата: 16.09.02 11:53
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте OlegK1, Вы писали:


OK>>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?


VK>Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно


Если своевременно не переписать первый байт пакета из порта в ОЗУ, то он будет затерт вторым байтом пакета и, таким образом, пакет корректно принят не будет.
Re: надо посылать по последовательному порту
От: Dront Россия  
Дата: 16.09.02 14:04
Оценка:
Здравствуйте OlegK1, Вы писали:

OK>Задача. Через каждые 20-50 мс надо посылать по последовательному порту пакет контроллеру и получать от него ответный пакет. Длительность пакетов: 1 мс. Длина пакетов: около 10 байт.

OK>Как грамотно реализовать: с помощью драйвера или можно клиентским приложением?
OK>Посоветуйте какие-нибудь примеры

Есть еще один существенный вопрос: весь ли пакет передается с одинаковыми настройками COM-порта (кол-во start,stop,databits, parity, ...). Если в процессе их надо менять — будут проблемы.
WBR, Andrey Reznik (2:5020/2999, Andrey_Reznik@rambler.ru)
Re[2]: надо посылать по последовательному порту
От: OlegK1  
Дата: 16.09.02 14:34
Оценка:
Здравствуйте Dront, Вы писали:

D>Здравствуйте OlegK1, Вы писали:


OK>>Задача. Через каждые 20-50 мс надо посылать по последовательному порту пакет контроллеру и получать от него ответный пакет. Длительность пакетов: 1 мс. Длина пакетов: около 10 байт.

OK>>Как грамотно реализовать: с помощью драйвера или можно клиентским приложением?
OK>>Посоветуйте какие-нибудь примеры

D>Есть еще один существенный вопрос: весь ли пакет передается с одинаковыми настройками COM-порта (кол-во start,stop,databits, parity, ...). Если в процессе их надо менять — будут проблемы.


Настройки одинаковые для всего пакета
Re[4]: надо посылать по последовательному порту
От: OlegK1  
Дата: 17.09.02 06:24
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте OlegK1, Вы писали:


OK>>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?


VK>Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно


Может ли клиентское приложение своевременно переписывать байты из порта в ОЗУ, если оно не может попросить у контроллера приостановить передачу пакета?
Re[5]: надо посылать по последовательному порту
От: Sergey Россия  
Дата: 17.09.02 07:13
Оценка:
Здравствуйте OlegK1, Вы писали:

OK>>>А что будет, если 10-байтовый пакет от контроллера придет в последовательный порт, когда данный поток будет выключен Windows? Пакет пропадет?


VK>>Что то я не понял о чем ты ? Пакет будет стоять на порту, некоторое время, а потом пропадет. Это естественно


OK>Может ли клиентское приложение своевременно переписывать байты из порта в ОЗУ, если оно не может попросить у контроллера приостановить передачу пакета?


Какие нафиг "байты из порта в ОЗУ"? Ты ж с драйвером работаешь, а не с аппаратурой напрямую. Если тебя волнует, какого размера буфер используется драйвером, спроси об этом драйвер — GetCommProperties. Если одновременно с опросом конторллера в кваку не гонять, производительности даже первого пня за глаза хватит, чтоб десяток-другой компортов обслужить и выполнить любые разумные преобразования полученных данных.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: надо посылать по последовательному порту
От: Amor Россия  
Дата: 17.09.02 07:26
Оценка:
А все-таки у меня сейчас проблема: есть некая прога, написанная умными дядями , так вот под 98ые она работала. Установил себе 2000 и возникают проблемы. В чем может быть причина подскажите плз. Симтомы такие: видно, что передача идет, но контроллер не отвечает, а тут же перезагружаюсь в 98-ые — все нормально.
Спасибо!
Re[7]: надо посылать по последовательному порту
От: Alex Smirnov Россия  
Дата: 17.09.02 07:51
Оценка:
Здравствуйте Amor, Вы писали:

A>А все-таки у меня сейчас проблема: есть некая прога, написанная умными дядями , так вот под 98ые она работала. Установил себе 2000 и возникают проблемы. В чем может быть причина подскажите плз. Симтомы такие: видно, что передача идет, но контроллер не отвечает, а тут же перезагружаюсь в 98-ые — все нормально.

A>Спасибо!

А есть уверенность того, что эти умные дяди не жахают данные прямо по портам?
Alex
Re[8]: надо посылать по последовательному порту
От: Amor Россия  
Дата: 17.09.02 08:07
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>А есть уверенность того, что эти умные дяди не жахают данные прямо по портам?


Т.е. ? Что значит жахают? Но в любом случае, конечно, в этом нет уверенности, но программка сделана добротно, у фирмы есть ссылочка на свой сайт, вообщем все как положено!
Re[9]: надо посылать по последовательному порту
От: Alex Smirnov Россия  
Дата: 17.09.02 09:22
Оценка:
Здравствуйте Amor, Вы писали:

A>Здравствуйте Alex Smirnov, Вы писали:


AS>>А есть уверенность того, что эти умные дяди не жахают данные прямо по портам?


A>Т.е. ? Что значит жахают? Но в любом случае, конечно, в этом нет уверенности, но программка сделана добротно, у фирмы есть ссылочка на свой сайт, вообщем все как положено!


Жахают — исползуют напрямую обращение по портам. т.е. _outp()/_inpt()/... или out dx,al
Под 9x виндами такие обращения выполняются, т.к. есть доступ к физическим устройствам компа.
Под NT версиями виндов такие обращения из аппликации игнорируються! т.к. собственно поэтому и были придуманы
интерфейсы драйверов, через которые такое можно делать.
Alex
Re[10]: надо посылать по последовательному порту
От: Amor Россия  
Дата: 17.09.02 09:40
Оценка:
Здравствуйте Alex Smirnov, Вы писали:

AS>Жахают — исползуют напрямую обращение по портам. т.е. _outp()/_inpt()/... или out dx,al

AS>Под 9x виндами такие обращения выполняются, т.к. есть доступ к физическим устройствам компа.
AS>Под NT версиями виндов такие обращения из аппликации игнорируються! т.к. собственно поэтому и были придуманы
AS>интерфейсы драйверов, через которые такое можно делать.

Но видно ведь на входе контроллера данные какие-то есть! Нога дергается, как говорится! Значит комп данные передает. А вот не отвечает микросхема! Конечно, можно подумать, что с ней что-то неладное, но в 98-ых все нормально работает!
Re[11]: надо посылать по последовательному порту
От: Vasiliy_Krasnokutsky Россия  
Дата: 17.09.02 09:57
Оценка:
Здравствуйте Amor,
Единственный способ убедиться в том, что работает — вогнать осциллограф в порт на котором висит ваше устройство (вместо него или параллельно это неважно). Скорость передачи по порту ты знаешь (если нет, то подобрать недолго), следовательно засинхронизироваться сможешь. Включаешь программу, отправляешь данные и смотришь что твориться на осциллографе. Из этого можно понять работает ли программа вообще или нет ... Самое главное правильно воткнуть осциллограф, как это делается точно не помню (давно было), но если взять схему распайки выхода порта, то там сразу все станет понятно. Естественно вертикальную развертку вгоняешь на данные, а горизонталь на синхроимпульсы от порта.
После этого можно что-то утверждать, а так это пустой разговор получается.

С Уважением Краснокутский Василий
Re[12]: надо посылать по последовательному порту
От: Amor Россия  
Дата: 17.09.02 11:54
Оценка:
Здравствуйте Vasiliy_Krasnokutsky, Вы писали:

VK>Здравствуйте Amor,

VK>Единственный способ убедиться в том, что работает — вогнать осциллограф в порт на котором висит ваше устройство (вместо него или параллельно это неважно). Скорость передачи по порту ты знаешь (если нет, то подобрать недолго), следовательно засинхронизироваться сможешь. Включаешь программу, отправляешь данные и смотришь что твориться на осциллографе. Из этого можно понять работает ли программа вообще или нет ... Самое главное правильно воткнуть осциллограф, как это делается точно не помню (давно было), но если взять схему распайки выхода порта, то там сразу все станет понятно. Естественно вертикальную развертку вгоняешь на данные, а горизонталь на синхроимпульсы от порта.
VK>После этого можно что-то утверждать, а так это пустой разговор получается.

VK>С Уважением Краснокутский Василий


Я так и делал. Только я не пытался уловить данные, к-рые там проходят, их не много, да и неизвестно какие они.
НО ФАКТ — ПОРТ КАК-ТО РАБОТАЕТ. Что-то там видно. Но контроллер не отвечает!!! 98-ым отвечает, а 2000-ым не отвечает, он что их как-то распознает? шутка!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.