![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Dos-проиложение в окне Windows не работает с Com-портом
Mnch © (2003-12-21 16:45:00)
Есть программа, работающая с нестандартным периферийным устройством по com-порту. Написана под DOS. На старых компьютерах, пятилетней давности можно было ее запустить в окне Windows и она прекрасно работала. А вот на более новых компах она не может ни принимать, ни пересылать данные. В чем может быть проблема? Может новые адаптеры надо по другому инициализировать? Программа написана на Turbo Pascal, исходники имеются.
tesseract (2003-12-27 10:29:00) [1]
Максимум что можно посоветовать поставить программу для режима совместимости ХР для Доса, а так совет - работает на передачу данных - но может конвертируешь и на приём
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;
Mnch (2003-12-26 19:05:00) [2]
Главная проблема - проблема №1 заставить работать досовую прогу. Винду я победю, но позже. Может кто предложит свою версию инициализации ком-порта под ДОС такую, что работает в виндовом окошке?
tesseract (2003-12-26 17:32:00) [3]
как раз 98 винда позволяет прямой доступ к оборудованию. А так - читай DDK, там и обработчик прерывания можно написать. а байт чётности начала кадра можно менять только в начале считывания. Т.е. надо посмотреть есть ли информация, поставить байт чётности в нужное положение и потом уже читать глюки лечатся установкой альтернативного драйвера com-порта под XP, стандартный реально глючит.
Mnch (2003-12-26 14:49:00) [4]
[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, запускаем программку в окне - и не работает. Но другие проги-то, типа управления АТС работают. Следовательно ошибка программная.
ALEIIIKA (2003-12-26 14:16:00) [5]
[9]
Ответ на первый вопрос:
Современные Оси не позволяют работать напрямую с железом [1], так как работа с железом организована через виртуальные устройства. А OS *NT считают что все обращения должны проходить через из руки. Тут никак не обойтись без отладки приложения под новые OS/
Mnch (2003-12-26 13:04:00) [6]
Это хроматограф Нева (находится в состоянии сертификации). Практически доказано, что 9 битный формат допусим - это точно, я и доказывал и прогу эту писал лет пять назад. Вот только под winapi это очень криво получается реализовать. Не то чтобы совсем не получется - байтики ходют, но глюков сильно больше, чем под досом. И всю это бодягу переписывать заново времени нет, оно конечно надо, но не сразу.
Так что открыты два вопроса:
1. Тема этой ветки - почему из окна дос программа не может общаться по com-порту на современных компьютерах, а на старых может? При этом программная конфигурация этих машин идентична.
2. Как корректно реализовать 9-битный формат передачи на winapi?
tesseract (2003-12-26 09:40:00) [7]
слушай, а это не Масса-к ВП 15 Т.2? Байт этот меняеться геморно,но практически доказано, что это возможно.
Германн (2003-12-26 02:38:00) [8]
2 Mnch (25.12.03 11:26) [6]
> Да и формат передачи прикольный 9 значащих бит, т.е. бит четности используется как бит данных - постоянно переключается туда-сюда. ???
Отсюда и подробнее, пожалуйста!
Mnch (2003-12-25 11:26:00) [9]
Долго переписывать большая она. Да и формат передачи прикольный 9 значащих бит, т.е. бит четности используется как бит данных - постоянно переключается туда-сюда. В досе этот как-то надежнее было отлавливать. Если кто расскажет как абсолютно надежно это делать в винде буду очень благодарен. Причем в таком формате идет не только прием данных, но и передача. Как не допустить коллизий с этим дурацким битом? Фактически это можно пустить отдельной темой.
tesseract (2003-12-24 11:32:00) [10]
Если есть исходники, почему-бы просто не периписать под Winapi?
Mnch (2003-12-23 13:02:00) [11]
Вряд ли это паскалевская ошибка - пишу прямо в порты. Может надо медленнее это делать, может там процессы какие переходные должны успевать пройти?
Для справки: передача от компа к девайсу - последовательно пишем в порт. Обратно - обработчик прерываний.
Ради интереса надыбал один из первых тестовых вариантов этой проги, написанный на С++ - там такая же ерунда. Не хочет оно работать на хороших компах.
Германн (2003-12-23 03:59:00) [12]
Оп-ля. Неужто опять вылезла та самая ошибка Turbo Pascal - runtime error 200?
Mnch (2003-12-22 10:08:00) [13]
Под Win98 на современных компах не работает, на старых, типа Celeron 266, - за милую душу. Может надо где-то влепить какую-то задержку во время инициализации?
Германн (2003-12-22 03:31:00) [14]
Линейка W9x не помешает вашей программе, но вот линейка WinNT просто проигнорирует все обращения вашей программы к системным ресурсам, в том числе и обращения к com-порту.