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