|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 12:50 pm
DOS, "С", прексъвания и управление на COM порта
| Автор |
Съобщение |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
 DOS, "С", прексъвания и управление на COM порта
Здравейте,
да ви се намира сорс на програмка писана на "С" за управление на СОМ порт посредством прекъсвания. Намерих един подобен код на паскал, но този език ми е непонятен  . Под управление на СОМ порт имам предвид изпращане на байт, получаване на байт, елементарни неща. Колкото да се запозная с прексъванията и използването им в "С".
Мреси предварително.
|
| Пон Яну 23, 2006 7:52 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
уф? защо ти е на дос точно да се учиш на прекъсвания? както и да е, твоя работа.
сподели обаче какъв ти е компилатора, щото едно време подходите бяха много различни
|
| Пон Яну 23, 2006 7:56 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Какво да ти кажа, падам си малко мазохист  . Компилатора е Borland C++ 3.1 (класика  )
|
| Пон Яну 23, 2006 8:25 pm |
|
 |
|
alex11
Ранг: Минаващ
Регистриран на: Пон Авг 08, 2005 9:29 pm Мнения: 17
|
Не знам точно каква ти е целта .
Ако става въпрос за сериен порт там нещата са доста сложни за DOS по добре да се използва някаква готова библиотека тук слагам една ако не те интересува този похват трябва да се използват bios прекъсванията . Когато се занимавах с прекъсвания стигнах до извода че с какъвто и език да ползваш се прави процедура на асемблер защото преди прекъсването се зареждат нужните регистри и след генерирането на нужното прекъсване се прочитат пак регистри а на език от високо ниво това не може да стане . Ако те интересува точно това е добре да прочетеш книгата “ тайните прекъсвания на Microsoft & IBM “ там са описани всички прекъсвания на DOS .Ако не я намериш задай конкретен въпрос и ще ти дам справочните данни .
За паралелен порт нещата са доста прости ето пример не е на С но е елементарен ще се оправиш
Директен достъп до LPT върши работа защото няма реализиран буфер на никакво ниво на достъп така че прекъсванията не са нужни
alex_lpt декларираш една променлива от 0 до 255
asm директива за начало на асемвлера
mov dx,$378 регистър dx = $378 това обикновено е номера на порта на LPT
mov al,alex_lpt регистър al= alex_lpt
out dx , al извеждане към порта
end ; край на asm
Ако това за LPT ти върши работа ще ти дам по подробна информация
|
| Пон Яну 23, 2006 11:22 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Мерси за библиотеката, мисля че ще мие от ползна. Иначе конкретно став авъпрос за получаване на данни от серийния порт. Т.е. да се хване момента в който пристигат данните, текущата работа на програмата да се преустанови и да се премине към обработка на получаваните данни както при едн а ембедет система. Иначе за изпращането на данни проблем няма, то С-то си има и библиотечна функция за това.
То има и по-лесен начин с един готов компоненд за Borlad C++ Builder, но немога да го открия този компонент.
Благодаря за билиотеката, ще я разгледам подробно.
|
| Вто Яну 24, 2006 12:00 am |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Готов компонент: аз ползвам Async32 , свалил съм го от www.torry.ru. Безплатен е, добре се справя. Има ги и за Delphi.
|
| Вто Яну 24, 2006 10:57 am |
|
 |
|
alex11
Ранг: Минаващ
Регистриран на: Пон Авг 08, 2005 9:29 pm Мнения: 17
|
Мисля че не трябва да се забравя че това е DOS. Структурата на програмата под DOS обикновено е такава че не обработва събития както под WINDOWS стартира се приложението и то заема цялото процесурно време . За серийния порт има една специфика при инициализацията му се определя буфер местоположение в RAM и големина единственото което трябва да правиш от време на време да го проверяваш . Поддръжката на буфера се осигурява от BIOS така че не е нужно да разработваш собствен буфер защото и да направиш собствена резидентна програма за обработка на серийния порт тя едва ли ще е по добра от BIOS а и ще загубиш универсалността на програмата тя ще работи само на твоето PC.
Тези общи приказки едва ли ще ти свършат работа за това ще кача малко литература на български по въпроса .
|
| Вто Яну 24, 2006 2:48 pm |
|
 |
|
alex11
Ранг: Минаващ
Регистриран на: Пон Авг 08, 2005 9:29 pm Мнения: 17
|
Ако ти се занимава има и още
|
| Вто Яну 24, 2006 3:08 pm |
|
 |
|
jony++
Ранг: Минаващ
Регистриран на: Пон Сеп 19, 2005 12:49 am Мнения: 61
|
Абсолютно точно описа проблема, ако наистина качиш и малко литература направо ще си златен, защото тука с инициализирането на серийния порт не ми е мнгого ясно иначе за проберката на буфера отвреме на време няма проблем.
Мерси ина bateAz за компонента.
|
| Вто Яну 24, 2006 3:13 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
алекс, извинявай, ама много лаишко изявление...
биоса на РС не поддържа буфери за серйните порти. дори не поддържа и FIFO-то в чиповете. да не се бъркаш с клавиатурата?
в същност, биоса е най-най-най-бъгавото нещо в РС-то (след хардуера, разбира се). ако беше читав, всички щяха да го ползват, но никой за нищо не го ползва като функции (имам предвид програмни прекъсвания). така беше едно време, така е и днес. сега биоса се ползва само да инициализира чипсета и да зареди първия сектор от диска. това, по мое скромно мнение, може да стане с програмка на асемблер от максимално 2-3К, но днешните биоси имат менюта, сплашове, резервни копия, борба с вируси и са по 2Мбайта. но посъщество основните функции на биоса не са променени.
джони,
не можах да намеря сламка за борландско С от онази епоха... сигурно съм ги раздал преди години, защото по не си спомням да съм ги мяркал последните десетина. а може и праха върху тях да е толкова, че да не се виждат вече
няколко правила (по спомен)
- в инициализиращата част на твоята програма трябва някъде да запазиш стария вектор на прекъсване
- правиш функция на С, която е с атрибут interrupt. трябва да поровиш хелпа как точно се пише, но тази функция е по-особена, най-малкото защото има RETI сместо RET накрая. мисля, че за забраната на прекъсвания п овреме на тази фунция трябва да се грижиш сам (sei/cli), май нямаше атрибут/прагма на компилатора за това.
- в функията си четеш директно порта на серйния чип и интерпретираш от къде ти е дошло прекъсването и какво да правиш с него
- сменяш вектора на прекъсването да сочи твоята функция и уведомяваш за това интеръпт контролера
- ако е предвидено от твоята програма да се излиза, трябва във функцията преди излизане (по спомен трябва да е нещо като onexit) да възстановиш стария стария вектор.
|
| Вто Яну 24, 2006 3:21 pm |
|
 |
|
alex11
Ранг: Минаващ
Регистриран на: Пон Авг 08, 2005 9:29 pm Мнения: 17
|
Дедоборе мнението е като гъза всеки го има даже и ти .Съвет: не давай квалификации защото това което се вижда, през живота си не си прехващал нито едно прекъсване, за идеята това се прави така:
Пише се самостоятелна резидентна програма не процедура каквото ти дрънкаш. Заделя се памет за нея защото трябва постоянно да е в паметта да не реши някоя програма да се намести на нейно място . Програмата има ред особености компилира се като .COM а не .EXE няма да обяснявам защо много си далеко от това, началото трябва да е на асемблер за да се съхранят регистрите в стека защото това не WINDOWS и никои не му пука за регистрите, после прави каквото ще прави възстановяват се регистрите и край . При първото стартиране на програмата се извлича вектора на оригиналната обработка на прекъсването за да може в края да се предаде управлението на нея, после се променя вектора на прекъсването в този случаи е 14h да сочи началото на програмата. Програмата има за цел да извлече информацията от порта и да я сложи в буфер .
Егати колко съм умен аз съм първия, който се е сетил за това ( ирония защото може и да не се досетиш ) това всъщност не е вярно това е толкова умно че хората са го сложили като стандартна функция в BIOS които обикновено е по малко бъгав от моя софтуер вероятно и от твоя . А четенето с буфер е прекъсване 14h функция A5h
За другите ако ви трябва ще ви дам пълно описание на 14h на български.
|
| Вто Яну 24, 2006 5:56 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
@alex11, колега, уважения към труда ти за детайлно описване на работа с прекъсвания, нямам забележки освен тона ти... и с риск да подкладя огъня, в който така смело наливаш масло, да те попитам случайно ако ползваш повече от едно прекъсване (клавиатура, сериен порт, etc) не те ли бърка състоянието на работните регистри? Означава ли че трябва след като си компилирам самостоятелния .COM изпълним файл трябва обстойно да разгледам дали случайно компилатора не използва някой регистри които аз пренебрегвам докато чета char от серийната връзка в interrupt?
|
| Вто Яну 24, 2006 6:10 pm |
|
 |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
алех11, брато, това че даваш едно от решенията на проблема не означава че е единственото или че е най доброто!!! ама никакав проблем не е да се хване кое да е прекъсване в ДОС в собствена програмка КОЯТО НЕ Е РЕЗИДЕНТНА а нормална узерска - та даже е за предпочитане щото е по просто.
Твоята идея е просто нещо като драйвер кой да могат да го ползват всички ДОС програмки - ама кому е нужно това??? На пича просто му трябва да си работи с кома с неговата си програмка.
И недей да ми спориш че не съм прав щото мога да се подкрепя с сорсове 
|
| Вто Яну 24, 2006 6:28 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
мери си приказките, момче!
много ще е интересно да постнеш кода на една твоя резидентна програма за обслужване на прекъсване, която да няма процедури(функции). по-дълбок анализ на писанията ти не ми се прави, ще е търкане на клавиатурата.
също, ще съм ти много благодарен, ако намериш някъде работа със серйния буфер през биос на тази страница http://www.ctyme.com/intr/int-14.htm. от написаната от теб функция A5h ми се струва, че се бъркаш с BAPI?
|
| Вто Яну 24, 2006 6:30 pm |
|
 |
|
alex11
Ранг: Минаващ
Регистриран на: Пон Авг 08, 2005 9:29 pm Мнения: 17
|
ок че накой ще ме бие
|
| Вто Яну 24, 2006 6:55 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 6 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|