Вопрос № 95930: доброго времени суток! Передо мной стоит задача: нужна программа, которая управляла бы последовательным портом компьютера, т.е. подавала бы логический ноль (0 вольт)или единицу(+5 вольт) на нужный пин портапомогите кто сможет, пожалуйста....Вопрос № 95934: Нужно написать прогу. помогите пожайлуста.
Есть текстовый документ, в нем написаны ссылки на сайты построчно(см. прил.)
нужно чтобы, запустив программу открылась первая ссылка а через 60-70 секунд открывалась следующая ссылка, а затем следующ...
Вопрос № 95.930
доброго времени суток! Передо мной стоит задача: нужна программа, которая управляла бы последовательным портом компьютера, т.е. подавала бы логический ноль (0 вольт)или единицу(+5 вольт) на нужный пин портапомогите кто сможет, пожалуйста.
Отправлен: 22.07.2007, 08:57
Вопрос задал: Deimos25 (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Градов Юрий Михайлович
Здравствуйте, Deimos25!
Пример компонета для работы с последовательным портом, взята из справочника DelphiWorld. Скопируйте из приложения текст. Создайте Unit и вставьте текст. Сохраните, как Comm.pas, затем зарегистрируйте компонент. Уточнения пишите в минифорум.
Приложение:
--------- Глаза боятся - руки делают!
Ответ отправил: Градов Юрий Михайлович (статус: Практикант)
Ответ отправлен: 22.07.2007, 12:02
Отвечает: Виктор Пырлик
Здравствуйте, Deimos25!
Работа с аппаратурой под Windows накладывает ограничения, в частности, вы должны использовать функции API для доступа к аппаратной части, или, использовать/писать собственные драйвера для доступа – например, драйвер GiveIO (http://www.void.ru/content/701).
Для получения доступа к аппаратуре средствами API используется следующая последовательность шагов:
1. Получить Handler устройства вызовом CreateFile с именем устройства. Более подробно см Windows SDK Help.
2. Для управления устройством вызывать функции API для данного устройства, либо посылать IOCTL(input - otput control) последнее через DeviceIOCtl(подробно см Windows SDK Help).
3. Закрыть устройство CloseHandle(Handler);
Последовательный порт
Открытие порта:
Var
FHandle: Thandle;
FHandle := CreateFile(
PChar(ComString), // тут может быть например COM1 COM2 b и т.д.
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
Параметр 1: Имя порта – ‘COM1’, итд
Параметр 2: режим открытия GENERIC_READ – чтение, GENERIC_WRITE – запись
Параметр 3: режим разделения ресуртса. Примечание: 0 – неразделяемый (именно так описано открытие последовательного порта в WIN SDK, другие режимы не проверял).
Параметр 4: Режим безопасности. Имеет смысл в Windows NT, Windows 9x игнорирует его.
Параметр 5: Способ открытия. Для порта - OPEN_EXISTING – открыть, когда устройство реально существует.
Параметр6: режим наложения операций - FILE_FLAG_OVERLAPPED – разрешение таких операций. При этом операции чтения – записи, требующие значительного времени, выполняются фоново по отношению к основному потоку программы.
Параметр7: шаблон файла, для последовательного порта – всегда 0.
В случае нормального открытия порта FHandle – дескриптор порта, при неудаче содержит значение INVALID_HANDLE_VALUE.
Закрытие порта:
Закрытие порта выполняется вызовом CloseHandle(FHandle).
Настройка параметров передачи (скорость, кол-во бит, стоп биты)
Структура данных о настройках порта (device control block) DCB содержит информацию о настройках порта. Поля структуры:
DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate // Скорость передачи (baud rate). Есть стандартный набор
// скоростей: все константы скоростей выглядят как CBR_<число>.
//Пример CBR_9600, CBR_115200.
Flags
DWORD fBinary: // режим проверки символа Eof – включение данного режима Windows
// не поддерживает ( по крайней мере сейчас). Маска $01
DWORD fParity: //Контроль четности Маска $02 – включение контроля четности
DWORD fOutxCtsFlow: // Маска $04 – Включение контроля сигнала CTS при выводе байтов.
DWORD fOutxDsrFlow: // Маска $08 – Включение контроля сигнала DSR при выводе байтов.
DWORD fDtrControl: // Маска $30 – Тип контроля сигнала DTR: значения
DTR_CONTROL_DISABLE деактивация сигнала.
DTR_CONTROL_ENABLE конкретное значение сигнала можно задавать через
вызов EscapeCommFunction.
DTR_CONTROL_HANDSHAKE Автоматическое управление сигналом.
DWORD fDsrSensitivity: // Маска $40 - Включение контроля сигнала DSR.
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX: // Маска $100. Включение режима работы по XON XOFF при передаче
DWORD fInX: // Маска $200 -//- при приеме
DWORD fErrorChar: // Маска $400. Разрешение замещения при ошибочном приеме
// (несовпадение четности) принятого байта на член структуры ErrorChar.
DWORD fNull: // Маска $800 enable null stripping – пропускать при приеме символы NULL
DWORD fRtsControl: // Маска $3000. Тип контроля:
RTS_CONTROL_DISABLE
RTS_CONTROL_ENABLE
RTS_CONTROL_HANDSHAKE Аналогично сигналу DTR
RTS_CONTROL_TOGGLE – Высокий уровень пока, есть данные для передачи.
DWORD fAbortOnError // Маска $4000. Прекращение операций
// чтения – записи при возникновении ошибок
DWORD fDummy2:17; // Не используются
Другие данные структуры
WORD wReserved; // Не используется
WORD XonLim; // минимальное число байт в приемном буфере до отправки символа XON
WORD XoffLim; // максимальное число байт в приемном буфере до отправки символа XOFF
BYTE ByteSize; // количество бит в байте от 4 до 8
BYTE Parity; // 0-4=no,odd,even,mark,space бит паритета,
BYTE StopBits; // 0,1,2 = 1, 1.5, 2 – стоп биты,
// 1,5 используются только при 5 битах в посылке для мелкосхемы 8250.
char XonChar; // Tx and Rx XON символ
char XoffChar; // Tx and Rx XOFF символ
char ErrorChar; // Символ, которым заменяется ошибочно принятый байт
char EofChar; // end of input character
char EvtChar; // received event character
WORD wReserved1; // Не используется
Delphi имеет оболочку для DCB – TDCB.
Получить текущую конфигурацию порта можно функцией GetCommState(Fhandle:Handle; fDCB:TDCB).
Установить соответственно SetCommDCB.
После установки параметров порта. Читать и писать можно через ReadFile и WriteFile.
В приложение приводится модуль работы с ком-портом. Для сокращения кода, убраны некоторые проверки, что в реальной программе необходимо сделать.
Приложение:
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 22.07.2007, 13:14
Вопрос № 95.934
Нужно написать прогу. помогите пожайлуста.
Есть текстовый документ, в нем написаны ссылки на сайты построчно(см. прил.)
нужно чтобы, запустив программу открылась первая ссылка а через 60-70 секунд открывалась следующая ссылка, а затем следующая и так далее. Ссылки меняются в зависимости от содержания текстового документа.
Я думаю понятно описал суть проги.
Помогите. очень нуна. Спасибо всем кто откликнется.
Отвечает: Градов Юрий Михайлович
Здравствуйте, Колпаков Александр Константинович!
Посмотрите, пожалуйста листинг в приложении, на форму помещается Button1, OpenDialog1 и Timer1.
Ответ отправил: Градов Юрий Михайлович (статус: Практикант)
Ответ отправлен: 22.07.2007, 11:37
Отвечает: DimonSoft
Здравствуйте, Колпаков Александр Константинович!
Решение задачи достаточно просто. Если нет никаких ограничений на использование, например, VCL, то я бы решил эту проблему так...
1. С помощью объекта TStringList загружаем файл в ОЗУ. Выбрать файл можно OpenDialog'ом или любым другим способом (зависит от Вашей программы).
2. Размещённый на форме TTimer с нужным интервалом. По таймеру открываем очередной адрес (см. ниже), который соответствует первой строке TStringList'а, и удаляем первую строку.
3. Открыть адрес в броузере можно при помощи ShellExecute. Для использования этой функции не забудьте подключить модуль ShellAPI. Описание функции есть в справке по WinAPI, которая идёт вместе с Delphi.
Теперь приблизительный код. В объявлении формы добавляем описание
AddressList:TStringList;
Рекомендую создать TStringList во время создания формы (OnCreate) и удалить при удалении формы (OnDestroy): так Вам удастся избежать разных Access Violation'ов и прочих неприятностей.
procedute TYourForm.FormCreate(...);
begin
...
AddressList:=TStringList.Create;
...
end;
procedute TYourForm.FormDestroy(...);
begin
...
AddressList.Free;
...
end;
Процедура загрузки списка из файла может быть реализована по какому-либо событию. Я приведу просто фрагмент кода, нужный для загрузки с учётом того, что мы создаём AddressList вместе с формой.
procedure TYourTimer.TimerTimer(...);
begin
...
if AddressList.Count>0 then
begin
//Среди параметров ShellExecute в соответствии со справкой указываем
//вместо имени файла нужный адрес. Это записывается так:
//
//PChar(AddressList[0])
//
//PChar - это приведение типов
ShellExecute(...);
AddressList.Delete(0); //Удаляем первый элемент списка
end
else
begin
... //Здесь можно отключить таймер, т.к. адресов в списке больше не осталось
end;
...
end;
В примере кода использованы имена контролов YourForm и YourTimer. В Вашем случае они, естесственно, будут другими.
С уважением, DimonSoft.
Ответ отправил: DimonSoft (статус: 3-ий класс)
Ответ отправлен: 22.07.2007, 11:40
Отвечает: Виктор Пырлик
Здравствуйте, Колпаков Александр Константинович!
В приложении рабочий код.
Приложение:
--------- Если ничего не помогло - надо читать инструкцию
Ответ отправил: Виктор Пырлик (статус: Студент)
Ответ отправлен: 22.07.2007, 14:23
Отвечает: Vlad Cepesh
Здравствуйте, Колпаков Александр Константинович!
Попробуйте вот это.
Приложение:
Ответ отправил: Vlad Cepesh (статус: 1-ый класс)
Ответ отправлен: 23.07.2007, 10:15