Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Jimhucksly
Статус: 5-й класс
Рейтинг: 697
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 593
∙ повысить рейтинг »
Тимошенко Дмитрий
Статус: Студент
Рейтинг: 478
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Номер выпуска:1434
Дата выхода:25.09.2009, 17:30
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:574 / 205
Вопросов / ответов:1 / 1

Вопрос № 172361: Уважаемые эксперты не когда не работал с СОМ портами помогите разобраться. Нужна программа считывания из СОМ порта данных в переменную или в файл и передачи после обработки обратно в СОМ. За ранее спасибо....



Вопрос № 172361:

Уважаемые эксперты не когда не работал с СОМ портами помогите разобраться.
Нужна программа считывания из СОМ порта данных в переменную или в файл и передачи
после обработки обратно в СОМ. За ранее спасибо.

Отправлен: 20.09.2009, 12:08
Вопрос задал: Maklin, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает 6a3uJI, 8-й класс :
Здравствуйте, Maklin.

В Windows для работы с коммуникационными портами используются те же функции, что и для работы с файлами.

Функции Windows для работы с COM-портами.
1. Открытие и закрытие порта.

function CreateFile(
lpFileName: PChar; //имя файла(порта)
dwDesiredAccess, // способ доступа к файлу
dwShareMode: DWORD; // тип совм естного доступа
lpSA: PSecurityAttributes; // атрибут защиты
dwCreationDisposition, // параметры создания файла
dwFlagsAndAttributes: DWORD; // атрибуты файла
): THandle;

function CloseHandle(
hObject: THandle // дискрептор порта
): BOOL;

ПРИМЕР ИСПОЛЬЗОВАНИЯ:

var
ComHandle: THandle; // переменная для хранения дескриптора порта
....

// Открыть порт
ComHandle:= CreateFile('\\.\COM1',
GENERIC_READ or GENERIC_Write,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0
);
// Проверяем результат
if ComHandle = INVALID_HANDLE_VALUE then
begin
{Ошибка открытия порта, функция GetLastError вернет код ошибки}
Exit;
end;
{...порт открыт успешно...}
{...использование порта через дескриптор ComHandle...}
// закрытие порта
CloseHandle(ComHandle);


2. Чтение данных из порта.

function ReadFile(
hFile: THandle; // дескриптор, полученный от CreateFile
var Buffer; // буфер для чтения
nNumberOfBytesToRead : DWORD; // число байт для чтения
var lpNumberOfBytesRead: DWORD; // реально прочитанное число байт
lpOverlapped: Poverlapped // параметры асинхронного чтения
): BOOL;

ПРИМЕР ИСПОЛЬЗОВАНИЯ:

var
ComHandle: THandle;
CurrentState: TComStat;
CodeError: Cardinal;
PData: Pointer;
AvaibleBytes, RealRead: Cardinal;
begin
ComHandle:= CreateFile(...);
... ... ...
{Возвращает структуру состояния порта и код ошибки}
ClearCommError(ComHandle, COdeError, @CurrentState);
{Число полученных, но еще не прочитанных байт}
AvaibleBytes:= CurrentState.cbInQue;
{Проверка числа доступных байт}
if AvaibleBytes > 0 then
begin
GetMem(PData,AvaibleBytes);
if ReadFile(ComHandle, PData^, AvaibleBytes, RealRead, nil) then
begin
{Реально прочитано RealRead байт}
end;
FreeMem(PData);
end;
... ... ...
CloseHandle(ComHandle);
end;


3. Передача данных.

function WriteFile(
hFile: THandle; // дескриптор, полученный от CreateFile
const Buffer; // буфер данных
nNBTW : DWORD; // длина буфера
var lpNBW: DWORD; // реально прочитанное число байт
lpOverlapped: Poverlapped // параметры асинхронного чтения
): BOOL;

ПРИМЕР ИСПОЛЬЗОВАНИЯ (синхронная запись):

var
FComPortHandle: THandle;
DataPtr: Pointer;
nToWrite, nWrite: Integer;
... ... ...
FComPortHandle:= Create(...);
nToWrite:= кол-во передаваемых байт
GetMem(DataPtr, nToWrite);
... заполняем буфер данными...
WriteFile(FComPortHandle, DataPtr^, nToWrite, nWrite, nil);
FreeMem(DataPtr);
CloseHandle(FComPortHandle);


ПРИМЕР ИСПОЛЬЗОВАНИЯ (асинхронная запись):

var
FComPortHandle: THandle;
AsyncPtr: PAsync;
BytesTrans: DWORD;
... ... ...
FComPortHandle:= Create(...,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0
);
{Создание асинхронных параметров}
New(AsyncPtr);
with AsyncPtr^ do
begin
Kind:=0; {0 - write, 1 - read}
GetMem(Data, Count);
Move(Buffer, Data^ , Count);
Size:= Count;
end;
{Передача данных}
WriteFile(FComHandle, Buffer, Count, BytesTrans, @AsyncPtr^.Overlapped);
{Освобождение памяти}
Dispose(AsyncPtr);
CloseHandle(FComHandle);


Дополнительную информацию по параметрам и функциям можно взять из MSDN.
Удачи!

Ответ отправил: 6a3uJI, 8-й класс
Ответ отправлен: 21.09.2009, 12:11

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254445 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.9 от 25.09.2009

    В избранное