реклама на сайте
подробности

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
> Работа с СОМ портом, Win2000
Lukomor
сообщение Mar 29 2005, 09:22
Сообщение #46


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 28-03-05
Пользователь №: 3 734



Цитата(-Tумблер- @ Mar 29 2005, 10:35)
1. поднять приоритет потока приложения повыше . Как можно выше и
не запускать другие приложения.
2. отрихтовать вручную (это для win98 - для XP сам смотри как там..):
пуск-настройка-панель управления-система-устройства-последовательный порт (1?)-свойства-настройка порта-дополнительно-буфер приема =1-OK.
*



Настройка вручную порта из виндов не помогает - все равно не успеваю.
Насчет приоритета потока, насколько я понял, все не так просто. Вот здесь есть переводная статья http://www.void.ru/?do=printable&id=701 ,правда по прямому доступу к порту, но основа там разложена хорошо.

Проблема в том, что у меня не работает (или я неправильно им пользуюсь) драйвер прямого доступа, хотя делал все по мануалу, включая ассемблерный код.
Go to the top of the page
 
+Quote Post
PowerF1
сообщение Mar 29 2005, 14:41
Сообщение #47


Участник
*

Группа: Новичок
Сообщений: 34
Регистрация: 12-03-05
Из: Новосибирск
Пользователь №: 3 288



_WM, боьшое спасибо за ценную информацию!
Разобрался(на моем уровне) с потоками. Многие вещи стали понятны. Установка маски и ожидание события действительно очень удобны при работе с потоками. Но все же вопрос ткаой остался, не знаю корректный ли он. Как распределяются ресурсы по потокам? выставляются приоритеты?
На счет ввода/вывода в одном потоке. Свою программу писал под 98 и вывод производился в основном потоке, при нажатиии клавиши. Ввод, по совету _WM, я загнал в отдельный поток. Такая комбинация под 98 работает, под XP не хочет. Может конечно не в этом дело.
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Mar 30 2005, 10:53
Сообщение #48


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(PowerF1 @ Mar 29 2005, 17:41)
Как распределяются ресурсы по потокам? выставляются приоритеты?

Попробуй почитать это:
http://club.shelek.com/download.php?id=239
Хотя лично мне в этой книге не все понравилось, но тем не менее
это одна из самых лучших книг.


Цитата(PowerF1 @ Mar 29 2005, 17:41)
  На счет ввода/вывода в одном потоке. Свою программу писал под 98 и вывод производился в основном потоке, при нажатиии клавиши. Ввод, по совету _WM, я загнал в отдельный поток. Такая комбинация под 98 работает, под XP не хочет.


У меня было то же самое. sad.gif
Скорее всего, поможет и ввод и вывод организовать в одном потоке.
smile.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Mar 30 2005, 11:52
Сообщение #49


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(Lukomor @ Mar 29 2005, 12:22)
Настройка вручную порта из виндов не помогает - все равно не успеваю.


А в цифрах - это сколько получилось ?
Как я понял, нужно 10 ms.
И насколько большой выходит "перебор" ? blink.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
_VM
сообщение Mar 30 2005, 21:04
Сообщение #50


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 23-03-05
Из: Москва
Пользователь №: 3 625



2Lukomor
Цитата(Lukomor @ Mar 29 2005, 08:36)
2 вариант - немного не понял. Что значит "с собственным драйвером"? Если это с использованием недокументированных I/O функций WINAPI, то это уже имело место быть в giveio и т.д.

С собственным драйвером, это значит с собственноручно написанным драйвером устройства, в котором делается обработка командных слов. Драйвер - грубо говоря, приложение работающее в контексте ядра, обладающее любыми возможностями для работы с аппаратурой.
11 мс это очень маленький интервал для Win приложения, увеличения приоритетов может не помогут. Логично предположить, что данные внешнему устройству нужно отправлять в обработчике прерывания COM-порта (сразу после получения командного слова). Сделать это можно только написав свой драйвер. Засада может быть одна - сложная (длительная) обработка командного слова в PC. Win не любит, когда драйвер много времени отжирает.

Цитата(Lukomor @ Mar 29 2005, 08:36)
Я пробую в виндовское оконное приложение воткнуть команды ассемблера для прямой работы с портом, а чтобы не "орала" защита гружу giveio.

Да я это понял:
Цитата(_VM @ Mar 28 2005, 12:19)
В виндовом приложении чтение можно организовать только полингом регистра статуса (LSR). Оно тебе надо? Это ж тормоза 100%, а на большой скорости данные теряться будут.


Вариант, по моему, тупиковый sad.gif Даже если ты и получишь доступ из виндового приложения к портам, как ты будешь узнавать, что данные поступили, т.е. в какой момент надо читать 0x3f8? Под ДОС все просто, либо прерывания по приему данных обрабатывай, либо регистр статуса (LSR) опрашивай (в нем есть бит, означающий наличие непрочитанных данных). В винде прерывания только в драйвере обработать можно. В пользовательском приложении(не драйвере) опрос(полинг) LSR может в любой момент прерваться по той же причине, по которой ты не успеваешь в WinAPI (многозадачность). Спасти может только наличие фифо буфера в UART.

Пуск->настройка->панель упр->система->оборудование->дисп.устройств->порты COM и LPT. Для выгрузки драйвера удали COM порт как устройство.
Далее не перезагружаясь запускай свою программу. Программа должна проинициализировать COM порт, а потом в цикле писать в 3f8. В общем все как под ДОС. Глупый вопрос, может ты данные не на том пине смотришь?

Увеличение приоритета меня порой спасало.
Для увеличение приоритета:
Приложения : SetPriorityClass() с GetCurrentProcessId()
Потока: SetThreadPriority() c GetCurrentThreadId();
Причем важно увеличивать приоритет не только приложения, но и потока в котором делаешь ReadFile()!!!
Go to the top of the page
 
+Quote Post
_VM
сообщение Mar 30 2005, 21:45
Сообщение #51


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 23-03-05
Из: Москва
Пользователь №: 3 625



2-Tумблер-&PowerF1&Lukomor
Проблем с разными потоками под XP не испытывал.
Отрываю от сердца самописный пример под ц++дебилдер 6.0
Он, по моему, работал на всем, что только можно.
В одном потоке нон-стопом льет данные в коматоз, в другом потоке из этого же кома принимает. Софтина задумывалась как тестер канала связи. Динамически снижает скорость при появлении ошибок.
Для проверки замкнуть пины RX и TX.
Глючит при закрытии, если не приняла ни одного байта.
Кто будет запускать exe - проверте на вирусы, я антивирусами не пользуюсь.
Исходники предоставляю для ознакомления, просьба ими не раскидываться.


о п с .... старая версия только есть. завтра с работы нормальную принесу.
Go to the top of the page
 
+Quote Post
Lukomor
сообщение Mar 31 2005, 06:38
Сообщение #52


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 28-03-05
Пользователь №: 3 734



Цитата(-Tумблер- @ Mar 30 2005, 14:52)
А в цифрах - это сколько получилось ?
Как я понял, нужно 10 ms.
И насколько большой выходит "перебор" ? blink.gif
*


По грубой оценке около 30-40 ms.
Go to the top of the page
 
+Quote Post
Lukomor
сообщение Mar 31 2005, 06:59
Сообщение #53


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 28-03-05
Пользователь №: 3 734



2_VM
Цитата(_VM @ Mar 31 2005, 00:04)
Пуск->настройка->панель упр->система->оборудование->дисп.устройств->порты COM и LPT. Для выгрузки драйвера удали COM порт как устройство.
Далее не перезагружаясь запускай свою программу. Программа должна проинициализировать COM порт, а потом в цикле писать в 3f8. В общем все как под ДОС. Глупый вопрос, может ты данные не на том пине смотришь?

Увеличение приоритета меня порой спасало.
Для увеличение приоритета:
Приложения : SetPriorityClass() с GetCurrentProcessId()
Потока: SetThreadPriority() c GetCurrentThreadId();
Причем важно увеличивать приоритет не только приложения, но и потока в котором делаешь ReadFile()!!!
*

Спасибо за совет, обязательно попробую, но чувствую придется мне писать драйвер. sad.gif
Пин вроде тот - проверял в W98 - передача идет.

2All
Никто случайно не знает, где в сети можно найти информацию по написанию драйверов на простеньком уровне? Потому как дело это для меня совсем новое. blink.gif
Go to the top of the page
 
+Quote Post
_VM
сообщение Mar 31 2005, 08:47
Сообщение #54


Участник
*

Группа: Свой
Сообщений: 58
Регистрация: 23-03-05
Из: Москва
Пользователь №: 3 625



Если владеешь C++ поищи Numega Driver Studio (софт коммерческий). Она с документацией идет. Для твоей задачи ненадо глубоко вникать в архитектуру виндов, а нумега ее внутри своих C++ классов скрывает. В общем я с нее начинал и доволен.

Но я бы на винапи еще подолбился бы. С драйвером конечно интереснее и надежнее, но разобраться не быстро получится.
Go to the top of the page
 
+Quote Post
max123
сообщение Apr 5 2005, 05:42
Сообщение #55


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 23-03-05
Пользователь №: 3 615



Цитата(uvw @ Feb 3 2005, 14:12)
Здравствуйте, уважаемые!
Если кто сталкивался, помогите плизз. Долбаюсь уже 2 недели, и ничего не получается. Ситуация следующая: Есть некий контроллер и общается он с компьютером через RS232, в Win98 все работает, а вот Операционка Win2000
блокирует прямое обращение к портам. Мне подсказали прогу WinDriver для обхода этой проблемы... но опять-же, для LPT порта там есть стандартная заготовка, которая прекрасно работает... а о СОМ порте ни слова. Сразу оговорюсь, я не являюсь системным программистом и с железом дел никогда не имел... а тут пришлось wink.gif Искренне надеюсь на Вашу помощь. Заранее спасибо.
З.Ы.
Я впервые на этом форуме, и вполне возможно что запостил тему не совсем в тот раздел куда следовало бы.
ЗЗ.ЫЫ
Работать с этой штукой через CreateFile/ReadFile/WriteFile тоже не получается,
в ReadFile постоянно нули возвращаются, хотя команда сформирована верно и контроллером принята...
*



Привет.
Может быть мой ответ устарел
Попробуй проверить свою программу так.

Соедени Com порты(Com1 , Com2) своей персоналки через нуль - модемный кабель.
Распайка
2-3
3-2
5-5
6 6
| |
4 4
7 7
| |
8 8
Запусти гипертерминал для Com2 в Win2000 и поставь настройки Com2
такие как в твоей программе для опроса контроллера.
Запусти свою программу для Com1 попробуй опросить контроллер.
Если программа что то кидает на Com1 то ты увидишь это в гипертерминале,
т.е. ты убедишься что у тебя программа что то посылает.


Так же я тебе могу предложить библиотеку программирования для COm
портов, если ты ее используешь то в программировании много знать не надо
она работает и под win2000 и под win98 (С ,VC, BC, VB)
ее можно скачать на www.webfile.ru
Файл номер 240397, pcommpro20.rar (размер 652 кбайт)




Пример:
int port = 2;

//настроить COM2 38400 8 бит данных 1 стоповый
ret = sio_ioctl ( 2, B38400, P_NONE | BIT_8 | STOP_1 );

if (ret != SIO_OK) {
/* Setting fail */
}


Нужно еще DTR поднять посмотри функцию в хелпе

ret = sio_open (port); //Открыть COM2
if ( ret != SIO_OK ) {
/* Open fail */
}
int len;
char buf[10];
len = sio_read( 2, buf, 10); //прочитать 10 байт с COM2
if (ch < 0) {
/* Fail */
}
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Apr 13 2005, 16:22
Сообщение #56


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(Lukomor @ Mar 31 2005, 09:38)
Цитата(-Tумблер- @ Mar 30 2005, 14:52)
А в цифрах - это сколько получилось ?
Как я понял, нужно 10 ms.
И насколько большой выходит "перебор" ? blink.gif
*


По грубой оценке около 30-40 ms.
*



Сегодня я ноконец померил - и вот что получилось:

При работе с одним потоком на прием и передачу - ~6 ms на ответ.
Если поток имеет приоритет NORMAL действительно, его прерывают
и иногда выходит ~30ms. Хотя и редко, это бывает.
Если поставить приоритет этому потоку Тайм_Критикал, то ему
никто особенно не мешает. smile.gif Кроме ~6ms других значений времени
не зафиксировано.
Система была WIN98, PII-300, VC6+API ONLY. smile.gif
Ничего особенно навороченного..
В качестве темплате использовалось готовое приложение
с двумя потоками - основной Нормал+2 и еще рабочий Нормал.
Под WIN-XP измерять буду завтра...
blush.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Apr 13 2005, 16:37
Сообщение #57


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(-Tумблер- @ Apr 13 2005, 19:22)
Под WIN-XP измерять буду завтра...
  blush.gif
*


Так вышло, что измерил сейчас.
Получилось то же самое ~6ms на ответ.
Все то же самое.

Вполне вероятно, можно обойтись без драйверов
и лазания в порты.
blush.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
Lukomor
сообщение Apr 21 2005, 08:59
Сообщение #58


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 28-03-05
Пользователь №: 3 734



Цитата(-Tумблер- @ Apr 13 2005, 19:37)
Цитата(-Tумблер- @ Apr 13 2005, 19:22)
Под WIN-XP измерять буду завтра...
  blush.gif
*


Так вышло, что измерил сейчас.
Получилось то же самое ~6ms на ответ.
Все то же самое.

Вполне вероятно, можно обойтись без драйверов
и лазания в порты.
blush.gif
*


2-Тумблер-
Спасибо, я действительно поигрался с приоритетами и потоками, вроде получилось, но проблема была в другом, "поймать" ответ устройства. Ответ приходит через ~11 мкс после запроса, при этом обмен идет через интерфесный девайс. От компьютера до девайса RS232 с управлением RTS, от девайса до устройства 485 интерфейс без управления потоком. Мне надо успеть вручную переключить RTS. Для работы с портом выставляю REALTIME_PRIORITY_CLASS и THREAD_PRIORITY_TIME_CRITICAL. С натягом, но все успеваю.
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Apr 21 2005, 13:29
Сообщение #59


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 4-11-04
Из: Московская область
Пользователь №: 1 040



Цитата(Lukomor @ Apr 21 2005, 11:59)
Для работы с портом выставляю REALTIME_PRIORITY_CLASS и THREAD_PRIORITY_TIME_CRITICAL. С натягом, но все успеваю.


Извините, если скажу общеизвестное. smile.gif
Приоритет потока - вешь относительная.
Если посмотреть каким-либо процесс вьювером,
можно обнаружить, что абсолютный приоритет
потоков "обычного" приложения не может превысить ~15.
У Кернела - вдвое больше.
Так что резервы еще есть. blush.gif
Можно попытаться увеличить приоритет процесса.
Тогда "THREAD_PRIORITY_TIME_CRITICAL" станет еще выше..
biggrin.gif


--------------------

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post
Lukomor
сообщение Apr 22 2005, 07:34
Сообщение #60


Участник
*

Группа: Новичок
Сообщений: 25
Регистрация: 28-03-05
Пользователь №: 3 734



Цитата(-Tумблер- @ Apr 21 2005, 16:29)
Извините, если скажу общеизвестное. smile.gif
Приоритет потока - вешь относительная.
Если посмотреть каким-либо процесс вьювером,
можно обнаружить, что абсолютный приоритет
потоков "обычного" приложения не может превысить ~15.
У Кернела - вдвое больше.
Так что резервы еще есть. blush.gif
Можно попытаться увеличить приоритет процесса.
Тогда "THREAD_PRIORITY_TIME_CRITICAL" станет еще выше..
biggrin.gif
*


Так REALTIME_PRIORITY_CLASS это вроде и есть приоритет процесса smile.gif
Скажу больше - для приоритета есть еще и динамический диапазон определяемый относительно базового. blink.gif
Правда для такого REALTIME приоритета процесса, поток все равно получился 15. Не знаю почему. Глубоко не ковырялся.
Go to the top of the page
 
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016