Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобратся с RS-232
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Капитан Хард
Прошу помощи разобратся.

Тут привожу функцию RS232(x) со скана книжки! а значит и ошибок много, написанная на Турбо Паскале для Windows. RS232(0) возвращает количество установленных COM-портов, RS232(1)-базовый адрес COM1, RS232(2) - базовый адрес COM2 и т.п.

Код
(*-библиотека ресурсов №A6 (определение базовых адресов COM-портов).-*)
(Universal auto detection of COM base address)
Function RS232(x:integer).integer; export;
(* $0000:$0400 содержит базовый адрес порта COM1,
$0000:$0402 содержит базовый адрес порта COM2,
$0000:$0404 содержит базовый адрес порта COM3,
$0000:$0406 содержит базовый адрес порта COM4,
$0000:$0406 содержит количество COM портов в двоичном формате.* )
var
Number_of_COM,  COM1, COM2, COM3, COM4:integer;
begin
numer_of_COM:=mem($40:$11); (*Считывает количество COM- портов*)
numer_of_COM:=(numer_of_COM and (8+4+2)) shr 1;
  COM1:=0; COM2:=0; COM3:=0; COM4:=0;
  COM1:=memw($40:$00); (*Процедура чтения из памяти*)
  COM2:=memw($40:$02);
  COM3:=memw($40:$04);
  COM4:=memw($40:$06);
Case x of
  0: RS232:= numer_of_COM;
  1: RS232:= COM1;
  2: RS232:= COM2;
  3: RS232:= COM3;
  4: RS232:= COM4;
end;
end;



Хочу этот код использовать в Делфи в проекте "управление двигателем" чтоб сначала проверить количество COMпортов на компе и их базовые адреса. Потом задам вопросы по инициализации COM порта.

Вопросы:
1. как переделать синтаксис чтобы этот код их Турбо паскаля заработал в Делфи
2. то что (*текст*) - коментарии? я прав?
3. обьясните мне этот участок кода:
Код
numer_of_COM:=mem($40:$11); (*Считывает количество COM- портов*)
numer_of_COM:=(numer_of_COM and (8+4+2)) shr 1;
  COM1:=0; COM2:=0; COM3:=0; COM4:=0;
  COM1:=memw($40:$00); (*Процедура чтения из памяти*)
  COM2:=memw($40:$02);
  COM3:=memw($40:$04);
  COM4:=memw($40:$06);

а именно:
3.1 что мы присваиваем переменной numer_of_COM в первой строчке? (имею в виду функцию mem($40:$11))
3.2 что мы добиваемся второй строчкой?
а именно: numer_of_COM and (8+4+2)) shr 1
почему не: numer_of_COM and 14) shr 1
3.3 COM1:=memw($40:$00); - функция memw($40:$00) из чего читает и что она делает

а теперь догадки : есть прелположение что функции memw и mem читают из ОЗУ . в инете встречал формулировку:
"Mem - это массив памяти. Т.е. с помощью указания номера элемента вы получаете доступ к определенной ячейке. существует 3 вида массива Mem:

* сам Mem - каждый компонент такого массива типа byte.
* MemW - каждый компонент типа word.
* MemL - каждый компонент типа longint."


Надеюсь на вашу помощь . help.gif
хотябы часть обьясните.
zltigo
Цитата(Капитан Хард @ Nov 14 2008, 23:35) *
Хочу...

Забудьте весь этот бред с данными BIOS и Борлондячими письменами при писательстве под WIN.
Xenom0rph
Цитата(zltigo @ Nov 15 2008, 00:09) *
Забудьте весь этот бред с данными BIOS и Борлондячими письменами при писательстве под WIN.

Под делфи есть компоненты для работы с ком портом, а так Win API использовать
Капитан Хард
Цитата(zltigo @ Nov 15 2008, 00:09) *
Забудьте весь этот бред с данными BIOS и Борлондячими письменами при писательстве под WIN.


значит данные берутся с Биоса? уже хорошо. Забыть я этот бред не могу - у меня такое д.з. правда изучаем мы паскаль...

с Win API не знаком

значит тогда поставлю вопрос попроще - как это все сделать чтоб оно работало в паскале?
SysRq
Цитата(Капитан Хард @ Nov 15 2008, 01:02) *
у меня такое д.з.
Давайте дословно и полностью, ежели хотите чтобы вам подсказали с чего начать и куда двигаться. А пока - не понятно.
Капитан Хард
Дословно? давайте.

дз звучит так : научится передавать байты байты по RS232 по книжечке автора Пей Ана (Сопряжение ПК с внешними устройствами).
написать программу которая будет проверять сколько портов на компе, их адреса , их инициализация и пересылка байтов. Вот такое задание.
для передачи данных использовать "3х проводной" интерфейс.

кстати насчет программы - я её немножко переработал , нашел ошибки в синтаксисе и урезал коментарии для наглядности кода:

Код
Function RS232(x:integer):integer; export;
var
  number_of_COM, COM1, COM2, COM3, COM4:integer;
begin
number_of_COM:=mem($40:$11);
number_of_COM:=(number_of_COM and (8+4+2)) shr 1;
COM1:=0; COM2:=0; COM3:=0; COM4:=0;
COM1:=memw($40:$00);
COM2:=memw($40:$02);
COM3:=memw($40:$04);
COM4:=memw($40:$06);
  Case x of 0:
  0: RS232:= number_of_COM;
  1: RS232:= COM1;
  2: RS232:= COM2;
  3: RS232:= COM3;
  4: RS232:= COM4;
  end;
end;
vvs157
Цитата(Капитан Хард @ Nov 15 2008, 01:02) *
с Win API не знаком
Придется изучить то, что относится к COM. Или использовать библиотеки. Методы работы взятые из ДОС под Виндами неприменимы. Про BIOS касательно последовательного порта под Win забудьте.
Цитата(Капитан Хард @ Nov 15 2008, 01:02) *
значит тогда поставлю вопрос попроще - как это все сделать чтоб оно работало в паскале?
Взять например http://sourceforge.net/projects/tpapro/
Капитан Хард
Цитата(vvs157 @ Nov 15 2008, 02:28) *
Методы работы взятые из ДОС под Виндами неприменимы.


а что имел в виду автор в книге говоря что прога под винду?



Цитата
Придется изучить то, что относится к COM. Или использовать библиотеки.

с чего начать?
DpInRock
Цитата
а что имел в виду автор в книге говоря что прога под винду?

Винда разная бывала. Windows 3.11 к примеру.
Обращение к портам напрямую из виндов не такая тривиальная задача.

http://www.zealsoftstudio.com/ntport/

Вот тут вам объяснят как это сделать. Тогда из ДОС приложения моно обращаться.
shuks
компонент для работы с COM-портом:
http://www.tmssoftware.com/site/async32.asp
Для всех версий делфи и c++ билдера. Бесплатен. С документацией.
zltigo
Цитата(DpInRock @ Nov 15 2008, 08:42) *
Обращение к портам напрямую из виндов не такая тривиальная задача.

Из NT консольного приложения доступ к стандартным COM портам и области BIOS виртуальной машины есть, но это не отменяет дебильность задания.
SysRq
Цитата(Капитан Хард @ Nov 15 2008, 03:38) *
а что имел в виду автор в книге говоря что прога под винду?
Картинки там есть? Наверняка там Windows 9x (или ниже). Для NT сие не может быть применено.

Уточните задание у преподавателя.
С т. з. использования COM-порта компьютера под управлением операционной системы для передачи информации, вам не нужны адреса и регистры. Управление осуществляется через API системы (это, грубо говоря, набор всяких функций). При этом о там как используются регистры можно отлично потеоретизировать, чтобы понимать суть как работают функции API.
DpInRock
Турбо Паскаля для NT я не встречал. И если нужно работать именно с ним, то без ntport не обйтись.

И вообще, эта дллка очень полезная в хозяйстве вещь. Вот вдруг ни с того, ни с сего понадобилось бы ногой ЛПТ порта подрыгать по-быстрому?
AHTOXA
Цитата(SysRq @ Nov 15 2008, 17:33) *
Картинки там есть? Наверняка там Windows 9x (или ниже). Для NT сие не может быть применено.


ntvdm достаточно хорошо виртуализует доступ к последовательным портам. Так что всё должно работать.
Капитан Хард
Цитата(DpInRock @ Nov 15 2008, 08:42) *
http://www.zealsoftstudio.com/ntport/
Вот тут вам объяснят как это сделать. Тогда из ДОС приложения моно обращаться.

в английском не рублю wacko.gif

Цитата(shuks @ Nov 15 2008, 09:48) *
компонент для работы с COM-портом


спасибо - попробую поставить но чувствую разобратся будет проблемма - нет ли каких нибудь книг на русском по этому компоненту?

Цитата(zltigo @ Nov 15 2008, 10:15) *
Из NT консольного приложения доступ к стандартным COM портам и области BIOS виртуальной машины есть, но это не отменяет дебильность задания.


пользуюсь XP и NT меня не волнует ... как и другие операционки.

Цитата(SysRq @ Nov 15 2008, 14:33) *
Картинки там есть? Наверняка там Windows 9x (или ниже). Для NT сие не может быть применено.

картинок там кроме кода нет. Уточнить задание не могу - препод мифическая личность, появляется раз в 2 недели и если я ему ничего не принесу будет полный армагеддец twak.gif

Цитата(SysRq @ Nov 15 2008, 14:33) *
С т. з. использования COM-порта компьютера под управлением операционной системы для передачи информации, вам не нужны адреса и регистры. Управление осуществляется через API системы (это, грубо говоря, набор всяких функций). При этом о там как используются регистры можно отлично потеоретизировать, чтобы понимать суть как работают функции API.


что за API системы ? это связано с программированием в Delphi или Паскале? (Первое приоритетней т.к. можно сделать прогу с кравивым и понятным интерфейсом). если это не зарагивает программирование даже и рассматривать не стоит.


Короче люди. подскажите как с помощью Delphi (ну или на крайний Pascal) запрограммировать программу для :
1. проверки адресов порта
2. инициальзации порта (установки скоростей , выводов и т.п.)
3. передачи данных (вбил в ячейку - нажал на кнопку - байт полетел)


как я понимаю для этого нужно скачать компонент для работы с COM-портом... но вот разобратся в его командах и синтаксисе без знания английского для меня проблемма
SysRq
Цитата(Капитан Хард @ Nov 15 2008, 15:56) *
пользуюсь XP и NT меня не волнует
XP и есть из линейки NT :)

Цитата(Капитан Хард @ Nov 15 2008, 15:56) *
что за API системы ?
API: Интерфейс программирования приложений - Википедия.

Читайте классику: Serial Communications in Win32 (частично на русском: Последовательная связь в Windows NT).
tyro
В XP com-порты прописаны в реестре. Как их извлечь - смотри прикрепленный файл.
А как с ним работать в Delphi внятно написано тут: http://articles.org.ru/docum/comport.php
zltigo
Цитата(DpInRock @ Nov 15 2008, 15:16) *
то без ntport не обйтись.

Повторять ложные утверждения не надо, пожалуйста!
Капитан Хард
Цитата
Читайте классику: Serial Communications in Win32 (частично на русском: Последовательная связь в Windows NT).


я конечно не сильно крут в программировании но ... синтаксис сльно напоминает Си.

Пока что пытаюсь разобратся, спасибо за ссылки...

-------------------------------

итак начнем... для того чтобы работать с Ком портом надо его "включить" грубо говоря и выставить настройки. а т.к. передача информации через порт работает как передача файлов (я прав?) мы джолжны включить этот процесс...

есть код файловой функции WinAPI:
Код
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDistribution,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);


чтобы работать с COM портом №1 нам надо переделать код вот так:

Код
HANDLE CreateFile(
LPCTSTR COM1,
DWORD GENERIC_READ|GENERIC_WRITE,
DWORD 0,
LPSECURITY_ATTRIBUTES NULL,
DWORD OPEN_EXESTING,
DWORD FILE_FLAG_OVERLAPPED,
HANDLE NULL
);


но как я понимаю это все под делфи не катит? для делфи надо использовать:
Код
hPort := CreateFile(‘COM1’, GENERIC_READ or GENERIC_WRITE, 0, nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, 0);

if hPort = INVALID_HANDLE_VALUE then
raise Exception.Create('Error opening port');


а это закрывает порт? а как это будет на Делфи?
Код
BOOL CloseHandle(
HANDLE hObject
)


З.Ы. кстати... чтоб разобратся во всем я начал вот тут тему писать... http://nstalker.forum24.ru/?1-3-0-00000001-000-0-0
XVR
Цитата(zltigo @ Nov 15 2008, 10:15) *
Из NT консольного приложения доступ к стандартным COM портам и области BIOS виртуальной машины есть,
Истины ради - прямого доступа все равно нет, VDM это все виртуализует и сводит к вызовам Win32 API (причем на пользовательском уровне, без обращений в ядро)



Цитата
но это не отменяет дебильность задания.
С этим согласен на все 100% smile.gif
Xenom0rph
Цитата(Капитан Хард @ Nov 15 2008, 15:56) *
в английском не рублю wacko.gif
спасибо - попробую поставить но чувствую разобратся будет проблемма - нет ли каких нибудь книг на русском по этому компоненту?
пользуюсь XP и NT меня не волнует ... как и другие операционки.
картинок там кроме кода нет. Уточнить задание не могу - препод мифическая личность, появляется раз в 2 недели и если я ему ничего не принесу будет полный армагеддец twak.gif
что за API системы ? это связано с программированием в Delphi или Паскале? (Первое приоритетней т.к. можно сделать прогу с кравивым и понятным интерфейсом). если это не зарагивает программирование даже и рассматривать не стоит.
Короче люди. подскажите как с помощью Delphi (ну или на крайний Pascal) запрограммировать программу для :
1. проверки адресов порта
2. инициальзации порта (установки скоростей , выводов и т.п.)
3. передачи данных (вбил в ячейку - нажал на кнопку - байт полетел)


как я понимаю для этого нужно скачать компонент для работы с COM-портом... но вот разобратся в его командах и синтаксисе без знания английского для меня проблемма


Ну, а ты что хотел, что бы тут за тебя программу написали, разбирайся, тем для изучения тебе много подкинули, прогугли по этой теме (по тем же самым win api), навярняка есть куча полезных статей в нете и на русском языке, приложи сам чуток усилий wink.gif
Вот примеры с одной книги по AVR, там из проги на Дельфи команды МК посылаются, может поможет чем : http://www.sendspace.com/file/l9xa12


[quote name='Капитан Хард' date='Nov 15 2008, 15:56' post='501275']
в английском не рублю wacko.gif
спасибо - попробую поставить но чувствую разобратся будет проблемма - нет ли каких нибудь книг на русском по этому компоненту?
пользуюсь XP и NT меня не волнует ... как и другие операционки.
картинок там кроме кода нет. Уточнить задание не могу - препод мифическая личность, появляется раз в 2 недели и если я ему ничего не принесу будет полный армагеддец twak.gif
что за API системы ? это связано с программированием в Delphi или Паскале? (Первое приоритетней т.к. можно сделать прогу с кравивым и понятным интерфейсом). если это не зарагивает программирование даже и рассматривать не стоит.
[b]Короче люди. подскажите как с помощью Delphi (ну или на крайний Pascal) запрограммировать программу для :
1. проверки адресов порта
2. инициальзации порта (установки скоростей , выводов и т.п.)
3. передачи данных (вбил в ячейк
Капитан Хард
Цитата
Ну, а ты что хотел, что бы тут за тебя программу написали, разбирайся, тем для изучения тебе много подкинули, прогугли по этой теме (по тем же самым win api), навярняка есть куча полезных статей в нете и на русском языке, приложи сам чуток усилий


Я уже далеко не чуток усилий приложил... и гуглил ... и в магазины за книжками бегал... по данной теме пусто! . Ну или я такой тупой.

А то что за меня программу писали... не... это не пойдет... я сам хоть тыщу прог напишу (тем более этого требуют). Просто я обычно читаю книги а там все по полкам разложено... если что непонятно в даташит лезу... а тут 07.gif 07.gif 07.gif ну просто темень какаято...

вы же профи!!!... вам ничего не стоит написать пару правильных строчек для примера. А потом я уже по командам буду разбиратся если что непонятно... а то в одном одно написано ... в другом другое... иногда понятно как это все работает но непонятно как это реализуется на практике .

а потом перекинте всю инфу в отдельный FAQ и будет всем начинающим прогерам счастье!!! beer.gif

Xenom0rph за програмки Респект и уважуха!!! Огромнейшее спасибо!!! через пару часиков сяду разбиратся. a14.gif
Xenom0rph
Когда я искал информациию по RS232 (Только под С++ Builder) тот же было много проблемм, кстати по Дельфи поподалось больше статей чем по С++, в этой ветке проскачила тема про COM порты, и там один человек выложил примеры, по ним разобрался за пару часов, там был пример с API функциями, поищи может поможет.
Капитан Хард
Цитата(Xenom0rph @ Nov 17 2008, 14:13) *
в этой ветке проскачила тема про COM порты, и там один человек выложил примеры, по ним разобрался за пару часов


и почему я этого не смог найти crying.gif ... как всегда "в танке"
MrYuran
Вот , приличная статейка, сам по ней начинал.
Тут вот тоже обсуждение, вроде и для делфей.
Капитан Хард
Цитата(MrYuran @ Nov 17 2008, 14:46) *
Вот , приличная статейка, сам по ней начинал.

негрузит 05.gif
Xenom0rph
Цитата(Капитан Хард @ Nov 17 2008, 14:31) *
и почему я этого не смог найти crying.gif ... как всегда "в танке"

да сейчас и я уже не смог найти, но вот, что мне помогло:
http://www.sendspace.com/file/bcvili
MrYuran
Цитата(Капитан Хард @ Nov 17 2008, 14:57) *
негрузит 05.gif

Тогда вот, почти то же самое, правда не так подробно

Чё-то у меня сегодня вообще ничё не открывается... То ли день такой, то ли прокси х.нёй страдает...
tyro
Посмотрите книжку http://ebookscomputer.ru/programming/2572-...-na-delphi.html
начиная с 441 страницы, может поможет.
SysRq
Еще исходники. Но не паскаль, звиняйте.. rolleyes.gif
AHTOXA
Ну если уж переметнулись на Дельфи, то ComPort Library. Компонент, удобный, надёжный, в исходниках. Что ещё нужно бедному студенту? smile.gif
tyro
Можно попользоваться продуктом фирмы MOXA. Там есть библиотека (в виде dll ) и куча примеров для Delphi, СИ, и вроде бэйсик. Взять можно здесь: http://www.moxa.com/support/resource_resul...mp;dprod_id=241
Капитан Хард
скачал
Программа конечно прикольная но я это должен сделать сам. а вот примеров на делфи я в этой программе не нашел.
tyro
Цитата(Капитан Хард @ Nov 18 2008, 01:19) *
скачал
Программа конечно прикольная но я это должен сделать сам. а вот примеров на делфи я в этой программе не нашел.

Если ставили по умолчанию, то примеры лежат: c:\Program Files\PCommLite\Example\DELPHI\
и что бы посмотреть что получается, их надо откомпилировать. А екзешники - это для работы с платами MOXA и Вам они вряд ли понадобятся. Сама их библиотека работает как часы, на моем опыте тикает не менее 8 лет.
Кстати в руководстве описано как это использовать. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.