Текущий архив: 2004.03.14;
Скачать: CL | DM;
ВнизDos-проиложение в окне Windows не работает с Com-портом Найти похожие ветки
← →
Mnch (2003-12-21 16:45) [0]Есть программа, работающая с нестандартным периферийным устройством по com-порту. Написана под DOS. На старых компьютерах, пятилетней давности можно было ее запустить в окне Windows и она прекрасно работала. А вот на более новых компах она не может ни принимать, ни пересылать данные. В чем может быть проблема? Может новые адаптеры надо по другому инициализировать? Программа написана на Turbo Pascal, исходники имеются.
← →
Германн (2003-12-22 03:31) [1]Линейка W9x не помешает вашей программе, но вот линейка WinNT просто проигнорирует все обращения вашей программы к системным ресурсам, в том числе и обращения к com-порту.
← →
Mnch (2003-12-22 10:08) [2]Под Win98 на современных компах не работает, на старых, типа Celeron 266, - за милую душу. Может надо где-то влепить какую-то задержку во время инициализации?
← →
Германн (2003-12-23 03:59) [3]Оп-ля. Неужто опять вылезла та самая ошибка Turbo Pascal - runtime error 200?
← →
Mnch (2003-12-23 13:02) [4]Вряд ли это паскалевская ошибка - пишу прямо в порты. Может надо медленнее это делать, может там процессы какие переходные должны успевать пройти?
Для справки: передача от компа к девайсу - последовательно пишем в порт. Обратно - обработчик прерываний.
Ради интереса надыбал один из первых тестовых вариантов этой проги, написанный на С++ - там такая же ерунда. Не хочет оно работать на хороших компах.
← →
tesseract (2003-12-24 11:32) [5]Если есть исходники, почему-бы просто не периписать под Winapi?
← →
Mnch (2003-12-25 11:26) [6]Долго переписывать большая она. Да и формат передачи прикольный 9 значащих бит, т.е. бит четности используется как бит данных - постоянно переключается туда-сюда. В досе этот как-то надежнее было отлавливать. Если кто расскажет как абсолютно надежно это делать в винде буду очень благодарен. Причем в таком формате идет не только прием данных, но и передача. Как не допустить коллизий с этим дурацким битом? Фактически это можно пустить отдельной темой.
← →
Германн (2003-12-26 02:38) [7]2 Mnch (25.12.03 11:26) [6]
> Да и формат передачи прикольный 9 значащих бит, т.е. бит четности используется как бит данных - постоянно переключается туда-сюда. ???
Отсюда и подробнее, пожалуйста!
← →
tesseract (2003-12-26 09:40) [8]слушай, а это не Масса-к ВП 15 Т.2? Байт этот меняеться геморно,но практически доказано, что это возможно.
← →
Mnch (2003-12-26 13:04) [9]Это хроматограф Нева (находится в состоянии сертификации). Практически доказано, что 9 битный формат допусим - это точно, я и доказывал и прогу эту писал лет пять назад. Вот только под winapi это очень криво получается реализовать. Не то чтобы совсем не получется - байтики ходют, но глюков сильно больше, чем под досом. И всю это бодягу переписывать заново времени нет, оно конечно надо, но не сразу.
Так что открыты два вопроса:
1. Тема этой ветки - почему из окна дос программа не может общаться по com-порту на современных компьютерах, а на старых может? При этом программная конфигурация этих машин идентична.
2. Как корректно реализовать 9-битный формат передачи на winapi?
← →
ALEIIIKA (2003-12-26 14:16) [10][9]
Ответ на первый вопрос:
Современные Оси не позволяют работать напрямую с железом [1], так как работа с железом организована через виртуальные устройства. А OS *NT считают что все обращения должны проходить через из руки. Тут никак не обойтись без отладки приложения под новые OS/
← →
Mnch (2003-12-26 14:49) [11][7]
Итак,имеем устройство - хроматограф. В нем есть два процессора - один (адрес F1) отвечает за нагреватели, другой (F2) - за механические приводы (насосы). Хроматограф шлет на комп посылки следующим образом от каждого из процессоров:
Формат слова: 1 старт-бит, 1 стоп-бит, бит четности, 8 бит данных.
Формат кадра 1 процессора:
байт 1: 1F1 (первая единица - бит четности) - признак кадра первого процессора;
байт 2: 0хх , где хх - код выполняемой команды (четность 0)
байты 3-24: 0хх, где хх - данные, четность 0
Формат кадра 2 процессора:
байт 1: 1F2 (первая единица - бит четности) - признак кадра второго процессора;
байт 2: 0хх , где хх - код выполняемой команды (четность 0)
байты 3-9: 0хх, где хх - данные, четность 0
Кадр 1-го процессора поступает каждые 23,7 мс, кадр 2-го раз в секунду.
В это же самое время от компа на хроматограф поступают команды управления, с аналогичным форматом - для первого проца кадр начинается с байта 1F1, для второго c 1F2. То есть бит четности используется как признак байта адреса процессора и начала кадра.
Вот тут и начинается закавыка - если во время приема кадра сменить бит четности (для передачи команды)- кадр будет потерян и есть риск неправильной идентификации поступающих данных. В ДОС это все решается просто - на приеме сидит обработчик прерывания и не дает изменить четность пока весь кадр не будет принят. А вот в винде как-то не удается добиться стабильсти. Прием осуществляется по одному байту, проверяется наличие события с ошибкой четности и. т. д. Попытался использовать Critical Sections, но как-то не убедительно вышло.
[9]
На старом компе стоит Win98, "которая не дает напрямую общаться с железом", запускаем программку в окне ДОС - все работает как часы. На новом компе стоит тоже Win98, запускаем программку в окне - и не работает. Но другие проги-то, типа управления АТС работают. Следовательно ошибка программная.
← →
tesseract (2003-12-26 17:32) [12]как раз 98 винда позволяет прямой доступ к оборудованию. А так - читай DDK, там и обработчик прерывания можно написать. а байт чётности начала кадра можно менять только в начале считывания. Т.е. надо посмотреть есть ли информация, поставить байт чётности в нужное положение и потом уже читать глюки лечатся установкой альтернативного драйвера com-порта под XP, стандартный реально глючит.
← →
Mnch (2003-12-26 19:05) [13]Главная проблема - проблема №1 заставить работать досовую прогу. Винду я победю, но позже. Может кто предложит свою версию инициализации ком-порта под ДОС такую, что работает в виндовом окошке?
← →
tesseract (2003-12-27 10:29) [14]Максимум что можно посоветовать поставить программу для режима совместимости ХР для Доса, а так совет - работает на передачу данных - но может конвертируешь и на приём
function TVP.Synchronize:integer;
var
nb:cardinal; buf,i:byte;
begin
Result:=-1;
// Устанавливаем байт чётности равный 1
dcb.Parity:=MarkParity; SetCommState(hCom,dcb);
// Сброс параметров
nb:=0;
// Номер весов
buf:=_ScaleNo;
// Посылаем номер весов
WriteFile(hCom,buf,1,nb,Nil);
sleep(80);
for i:=1 to 3 do
begin
ReadFile(hCom,buf,1,nb,Nil);
sleep(20);
if nb=1 then break;
end;
// Обработка ошибок
// Ничего не прочитали
if nb=0 then begin _LastError:=ErrSyncError; exit; end;
// Байт синхронизации
if buf<>$77 then begin _LastError:=ErrNoAnswer; exit; end;
// Сброс чётности
dcb.Parity:=ZeroParity;
if not SetCommState(hCom,dcb) then exit;
//Всё ОК
_LastError:=ScOK;Result:=0;
end;
Страницы: 1 вся ветка
Текущий архив: 2004.03.14;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.016 c