Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.88.249] |
|
Сообщ.
#1
,
|
|
|
Добрый день.
Написал прграмму, которая принимает/посылает в COM через порты ($3f8,$2f8). (Общается с устройством). В 98 всё работает четко - всё правильно посылает, принемает. В XP в порты писать напрямую нельзя, использовал Giveio.sys. При чтении байта из порта, всё время принимается $FF. Как такое может быть? Ведь в 98 всё работает, и код для XP и 98 одинаковый. Спасибо. |
Сообщ.
#2
,
|
|
|
В том то и дело, что для NT подобных винд с Com портом надо работать через API
(FileWrite, FileRead и т.д.). Если используя API написать такую прогу, то она будет работать и под W98 и под XP А на прямую в порт - это досовские вещи, но в 98 и ME еще прокатывают |
Сообщ.
#3
,
|
|||||
|
Скажу больше: Если Вы будете просто принимать/посылать в COM через порты $3f8,$2f8 то и под Win9x, то Ваша программа не сможет всегда правильно работать. Для правильной работы нужно использовать не только $3f8 и $2f8, а гораздо больше! Поэтому, под виндами (все равно под какими) гораздо легче использовать API. А если в лом изучать, то есть разные всякие готовые компоненты. Например AsyncProfessional (это круто) или tComPort (это попроще). |
Сообщ.
#4
,
|
|
|
Да, но я же написал, использую Giveio.sys. Этот драйвер даёт полный доступ к портам в NT системах. И порты приложение может использовать свободно, также как в 98.
WinApi использовать не возможно, как мне с помощью WimApi написать следуующую функцию? procedure WriteSerial(c:byte); const LineStatusReg = 5; { $*fd порт состояния линии} begin Вот эту строчку я в Api написать не смог. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! while (PortIn(PortBase+ LineStatusReg) and (THRE+TSRE) <> THRE+TSRE) do ; {// THRE = $20;}{// TSRE = $40;} {// transmitter shift and holding registers empty} {// transmitter holding register empty (THRE)} !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! PortOut(PortBase+ TXBuffer,c); while (PortIn(PortBase+ LineStatusReg) and (THRE+TSRE) <> THRE+TSRE) do ; {// transmitter shift and holding registers empty} {// transmitter holding register empty (THRE)} Sleep(2); end; Я переписавал всю прогу на API, в 98 всё ок, а в NT (XP,2000) временами виснит намертво. Вообще вся прога под изначально была под ДОС, мне её надо переделать в под винды. Лучший способ через порты, а не API. Переписать то в Api может я и перепишу, но и глюки новые от себя добавлю, а при использовании портов я измениния в исходном коде делаю минимальные. |
Сообщ.
#5
,
|
|
|
Прямой доступ к портам чреват как зависанием, так и крахом всей системы, там слишком много чего надо учитывать, но все равно неправильно, работать надо исключительно через специально написаный драйвер устройства, с регистрацией в системе, с резервированием ресурсов за собой, а не в обход системы.
То что это порт принтера, ничего не меняет, система и другие драйверы могут с ним работать и расчитывать, что никто не полечет к ним напрямую. Хочешь нормальную работу, осваивай DDK, но забудь про написание этого уровня в Дельфи, или MASM или VC, а вот общение уже можно на Дельфи. |
Сообщ.
#6
,
|
|||||||||
|
Дак ведь доступа к THRE+TSRE через API и не требуется. Там сами винды отслеживают готовность к передаче и пр. Там просто даешь данные, а он их размещает в буфере, и по мере готовности, передает.
Странно, обычно наоборот.
А вот это серьезный аргумент. Я сам, являюсь автором комерческого продукта работающего через COM-порты. Естественно начинал еще под DOS. Причем даже под DOS у меня использовалась самодельная многопоточность. Ну и со временем естественно пришлось переносить под винды, я пошел по пути Windows-API. Конечно, пришлось полностью переписать. Так-что все сложности понимаю. Поэтому, если надо быстро, хоть-как-нибудь - то делай как делаешь. Добавлено в
Ну это не совсем так, особенно под WinNT/2k/XP. Тем более, что CormaX использует драйвер Giveio (ведь совсем напрямую просто не дадут).
А вот в этом, я совсем не уверен. По моему я даже встречал что-то по написанию драйверов на Delphi. Если надо, могу поискать. Но для решения данной задачи никаких драйверов писать уже не придется, все они уже давно написанны мелкософтом |
Сообщ.
#7
,
|
|
|
Всё. На выходных посидел, и всё сделал. Включил комп, XP, запустил прогу, и всё заработало :-)
Непонятно, почему был глюк, и глюк ли это вообще Всем спасибо. |