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

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Работа с СОМ портом, Win2000
khach
сообщение Feb 15 2005, 10:11
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 3 439
Регистрация: 29-12-04
Пользователь №: 1 741



Как автор подтопика о программаторе, уточню. Не работает он потому, что писался по канонам хорошего программирования КОМ портов под ДОС. Т.е кроме работы с регистрами UART, он еще работает с регистрами контроллера прерываний- ставит свой обработчик хардверного IRQ 3/4. Если работу с портами UART многие драйвера КОМ устройств для 2000, XP,'эмулируют корректно ( даже некоторые USB ком порты ставили виртуализатор хардвари, и досовые проги вполне корректно с ними работали), то к контроллеру прерываний XP понятное дело не пускает.
Все это выяснено при дизасме управляющей программы. Теперь осталось два пути - первое- патчить прогу на предмет обращения к Вин API. Но я не настолько крут в хакинге, чтобы вызвать 32 разрядный API из 16-битного DOS DPMI приложения. Хотя это и возможно.
Второе - переписывать целиком управляющую прогу. Что успешно делаеться - переписано несколько ( из сотен) микросхем под винду. Основная проблема- снятие и расшифровка лога обмена между программатором и компом. Он, зараза, может одновременно передавать и принимать данные. А снифера/мониторы Кома под ДОС не работают. Соответственно приходиться писать протокол двумя портами на дополнительном компе. А потом этот лог разгребать для каждой микросхемы в программаторе.
Go to the top of the page
 
+Quote Post
Dimonira
сообщение Feb 16 2005, 11:23
Сообщение #32


Местный
***

Группа: Свой
Сообщений: 405
Регистрация: 4-10-04
Пользователь №: 777



Я как-то пропустил слова о реверс-инжиниринге.
Тогда всё понятно. Ломаете чужую IP.
В вашем случае по-моему проще снять протокол обмена, понять его, а дальше наваять свою программу.
Go to the top of the page
 
+Quote Post
Serjio
сообщение Feb 17 2005, 08:01
Сообщение #33


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

Группа: Свой
Сообщений: 137
Регистрация: 3-09-04
Пользователь №: 594



Мы пользуемся CPORT под все Windows
Прикрепленные файлы
Прикрепленный файл  cport_3.0.zip ( 210.06 килобайт ) Кол-во скачиваний: 907
 
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Feb 17 2005, 18:40
Сообщение #34


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

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



Цитата(khach @ Feb 15 2005, 13:11)
Не работает он потому, что писался по канонам хорошего программирования КОМ портов под ДОС. Т.е кроме работы с регистрами UART, он еще работает с регистрами контроллера прерываний  ... к контроллеру прерываний XP понятное дело не пускает.

*


Это не так.
Лично проверил это:
WinNT-4
WinXP Prof RUS
WinXp Rpof ENG
Win2003 Server Enterp. Edition

С компами - notebook какой-то там P~100, PII-300, Celeron-1100,
PIV~2,66 ДОС-программа с КОМ-портами по прерываниям РАБОТАЕТ !
tongue.gif tongue.gif tongue.gif
Мало того - эта программа еще и лезет нагло в видеопамять - и все OK.

Чтобы не обманывать научно-техническую общественность зазря,
привожу сами программы (программа-терминал + драйвер),
файлы "read.me" и все исходные тексты.

http://spiprog.chat.ru/comdos.zip
или
http://spiprog.narod.ru/comdos.zip

Программа не просто как то там тестировалась - к ком-порту
цеплялся осциллограф. На предмет проверки соответствия
летящих байтов, скоростей, стопов и стартов.
Все OK по полной программе.

tongue.gif tongue.gif tongue.gif


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

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


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

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



может кому пригодиться h__p://www.rs232.ru/
Go to the top of the page
 
+Quote Post
PowerF1
сообщение Mar 18 2005, 15:59
Сообщение #36


Участник
*

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



Подскажите, у меня такая проблема.
Когда собирал мк, написал прогу(а точне собрал уз кусочков) обмена информацией чз СОМ-порт. Это была передача в мк по нажатию клавиши и следом прием. т.е. при обработке сообщения WV_CHAR.
Никаких проблем, винда определила, что нажата клавиша, остается только отослать и принять данные. Так я оттестил мк, все работало.
Сейчас стоит другой вопрос. Мк должен только посылать данные на комп.А как их принимать я не знаю. Какое сообщение использовать, когда данные пришли? Может кто знает?
Мне говорили что-то про пользовательское сообщение. Как можно разрулить с ним?
Go to the top of the page
 
+Quote Post
_VM
сообщение Mar 23 2005, 17:01
Сообщение #37


Участник
*

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



Программируй на C++Builder - меньше заморачиваться с сообщениями будешь.

Судя по всему интересует асинхронное получение данных по COM порту. Пользовательское сообщение использовать можно, но судя по постановке задачи, опыта у тебя маловато. Не в обиду, хочу как лучше.

пользовательские сообщения описываешь, например, так:
#define MY_MSG (WM_APP+10)

заводишь поток(CreateThread), в котором читаешь COM порт (ReadFile). Операция чтения не должна быть OVERLAPPED! По получению данных, ReadFile разблокируется, вызывай тогда PostMessage(MY_MSG) или PostThreadMessage(MY_MSG), в зависимости от того, куда хочешь послать сообщение (окну или потоку). В том месте программы, где обрабатываешь WM_CHAR добавь обработку MY_MSG. Короче, данные из COM порта читаешь в одном потоке, а обрабатываешь в другом.

Можешь поступить проще - работать по таймеру.
1) Заводишь таймер (SetTimer), указывая хэндл своего окна.
2) В том месте, где обрабатываешь WM_CHAR, добавляешь обработку WM_TIMER. Обработка заключается в вызове ReadFile. ReadFile должен быть в этом случае overlapped, иначе он заблокирует твой поток до наступления таймаута, указанного при инициализации драйвера COM порта (SetCommTimeouts).

Уф! И да прибудет с тобой MS Win32 SDK...
Go to the top of the page
 
+Quote Post
Lukomor
сообщение Mar 28 2005, 07:40
Сообщение #38


Участник
*

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



Подскажите пожалуйста! Есть проблема работы с СОМ из под W2K с прямым доступом. Пробовал различные драйвера giveio/userport/porttalk/totalio - безуспешно. Данные в порт (0х3F8) уходят, но на выходе не появляются (проверял осциллографом). При запуске из w98 все работает (хотя там драйвера эти не нужны). К сожалению не могу перейти на WINAPI - протокол обмена конечного устройства не позволяет (из-за временнЫх задержек). Может кто с такой ситуацией сталкивался?
Go to the top of the page
 
+Quote Post
_VM
сообщение Mar 28 2005, 09:19
Сообщение #39


Участник
*

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



Если протокол связи накладывает жесткие временные ограничения (самый жесткач это ответ PC по запросу внешнего устройства через маленькое время), то спасет только собственный драйвер. Если под 98 задача решается, то под 2к при помощи своего драйвера ее тоже можно решить. Самые быстрые варианты управления COM-портом, в порядке возрастания (по собственным ощущениям):
1) DOS на СИ или ASMе wink.gif
2) WinNT, 2k, XP с собственным драйвером
3) Win95/98 с дос программой
4) Win API
5) WinNT, 2k, XP с DOS программой (работа с портами напрямую)

5й вариант самый медленный из-за приема данных. Данные-то надо забирать из фифо по прерываниям, а они до VDM (VirtualDosMashine) могут долго доезжать. В виндовом приложении чтение можно организовать только полингом регистра статуса (LSR). Оно тебе надо? Это ж тормоза 100%, а на большой скорости данные теряться будут.

Если не переубедил - я бы выгрузил стандартный драйвер 2k, настроил порт как в дос, и молотил бы в 0х3F8. Только не понятно зачем это все нужно (запуск дос программ под 2к или в виндовых приложениях).

Если протокол опишешь(где какие минимальные задержки), может подскажу как на WinAPI задачку решить, если это вообще реально сделать.
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Mar 28 2005, 11:05
Сообщение #40


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

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



Цитата(_VM @ Mar 23 2005, 20:01)
заводишь поток(CreateThread), в котором читаешь COM порт (ReadFile).


Можно лишь добавить - пишем в COM-порт из того же потока - WriteFile.
(Когда нужно- когда появились данные для вывода).
При этом эти операции выполняются строго
по-очередно. А иначе - при попытке читать/писать из разных
потоков получаются "полные раки".
smile.gif


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

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


Местный
***

Группа: Модераторы
Сообщений: 392
Регистрация: 23-06-04
Из: Харьков
Пользователь №: 151



А для отладки софта, работающего с СОМ под Windows, иногда удобно использовать драйвер виртуальных СОМ портов Virtual Serial Ports Driver

Он позволяет создать нужное количество пар COM портов , соедининенных виртуальными кабелями типа "null-modem". Виртуальные СОМ порты с точки зрения софта ничем не отличаются от реальных.
Go to the top of the page
 
+Quote Post
_VM
сообщение Mar 29 2005, 00:20
Сообщение #42


Участник
*

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



Цитата(-Tумблер- @ Mar 28 2005, 14:05)
Цитата(_VM @ Mar 23 2005, 20:01)
заводишь поток(CreateThread), в котором читаешь COM порт (ReadFile).


Можно лишь добавить - пишем в COM-порт из того же потока - WriteFile.
(Когда нужно- когда появились данные для вывода).
При этом эти операции выполняются строго
по-очередно. А иначе - при попытке читать/писать из разных
потоков получаются "полные раки".
smile.gif
*


А я что-то не соображу, почему из 2-х разных потоков одновременно читать/писать неполучится wacko.gif. Вот если из 2-х потоков одновременно писать захочется, то да - понадобится синхронизацию реализовывать. А при разделенных записи/чтении в чем проблема?
Go to the top of the page
 
+Quote Post
Lukomor
сообщение Mar 29 2005, 05:36
Сообщение #43


Участник
*

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



Спасибо _VM за ответ.
Цитата(_VM @ Mar 28 2005, 12:19)
...
1) DOS на СИ или ASMе wink.gif
2) WinNT, 2k, XP с собственным драйвером
3) Win95/98 с дос программой
4) Win API
5) WinNT, 2k, XP с DOS программой (работа с портами напрямую)
...

Варианты 1, 3, к сожалению, не подходят.

2 вариант - немного не понял. Что значит "с собственным драйвером"? Если это с использованием недокументированных I/O функций WINAPI, то это уже имело место быть в giveio и т.д.

Вариант 4 пробовал. При реализации на С++ с WINAPI (CreateFile + DCB + ...)
- не успеваю по протоколу.

Насчет 5, из DOSa, (я так понимаю что из консоли) заморочка для меня будет большая, так как основное приложение WIN32.

Я пробую в виндовское оконное приложение воткнуть команды ассемблера для прямой работы с портом, а чтобы не "орала" защита гружу giveio. Причем конфигурирую порт таким же образом, как в ДОСе. Все что посылаю при этом в 0x3F8...0x3FE уходит "в пустоту" sad.gif
Чтение 0x3F8 возвращает ранее записанное туда слово (на выходе порта по прежнему ничего не появляется!), а чтение остальных 0x3F_ возвращает FF.

Цитата(_VM @ Mar 28 2005, 12:19)
... я бы выгрузил стандартный драйвер 2k, настроил порт как в дос, и молотил бы в 0х3F8...

Возможно, это как раз то, что нужно. Если можно расскажи подробнее.

Цитата(_VM @ Mar 28 2005, 12:19)
...
Если протокол опишешь(где какие минимальные задержки), может подскажу как на WinAPI задачку решить, если это вообще реально сделать.
...

В протоколе 2 "засады":
1) от передачи командного слова от PC до ответного слова устройства - 15...40 мкс.
2) от передачи командного слова от устройства до ответного слово от PC 11 мс.

Буду благодарен за помощь!
Go to the top of the page
 
+Quote Post
-Tумблер-
сообщение Mar 29 2005, 06:04
Сообщение #44


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

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



Цитата(_VM @ Mar 29 2005, 03:20)
А я что-то не соображу, почему из 2-х разных потоков одновременно читать/писать неполучится


Честно говоря - я тоже. И был бы рад и благодарен,
если бы мне обьяснили - почему. sad.gif
Для меня это было неприятным сюрпризом.
Но опытным путем удалось установить:
Под:
WIN95 - никаких проблем.
WIN98 - становится неустойчиво
WINXP - система виснет так, что только аппаратный сброс.
Используя беседы в конфах, удалось выяснить, что не только
у меня так.
То ли это ошибки библиотек компиляторов (Рихтер весьма
прозрачно намекает об этом для VC). То ли это особенности ОС.
Я полагаю - возможно и то, и другое.
Собственно, это не мешает, если знаешь.
Один поток делает ReadFile, проверяет - есть ли для вывода,
если есть - WriteFile.
Иначе мне сделать не удалось.
smile.gif


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

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


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

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



Цитата(Lukomor @ Mar 29 2005, 08:36)
В протоколе 2 "засады":
1) от передачи командного слова от PC до ответного слова устройства - 15...40 мкс.
2) от передачи командного слова от устройства до ответного слово от PC 11 мс.


Полагаю, с пунктом 1 "API вариант" точно должен справится - почему нет ?
Не помню такого, что бы драйвер COM порта у WIN не принял
правильно данные даже на самой большой скорости и на не очень
сильном компьютере.

Со вторым пунктом действительно могут быть проблемы.
Тут можно попытаться:
1. поднять приоритет потока приложения повыше . Как можно выше и
не запускать другие приложения.
2. отрихтовать вручную (это для win98 - для XP сам смотри как там..):
пуск-настройка-панель управления-система-устройства-последовательный порт (1?)-свойства-настройка порта-дополнительно-буфер приема =1-OK.

smile.gif


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

- ЗАМЕНЯТЬ ДЕТАЛИ НА ХОДУ ВОСПРЕЩАЕТСЯ !!! -
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th April 2024 - 17:57
Рейтинг@Mail.ru


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