Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.02 c
3-43316
Ramdom
2004-02-17 13:55
2004.03.14
Не отображаются jpeg картинки в DBImage?


3-43388
Vetal
2004-02-13 16:47
2004.03.14
Почему очищается поле Connection при запуске Delphi в TADOxxx


14-43767
wara
2004-02-04 12:00
2004.03.14
Загниваение Delphi?


8-43700
Неопытный131
2003-11-15 10:10
2004.03.14
Работа в изображениями


6-43748
Silver_
2004-01-08 14:02
2004.03.14
Как отправить фаил на другои комп через телефон(модем :) )





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский