94 lines
5.2 KiB
C
94 lines
5.2 KiB
C
|
|
#include <stdio.h>
|
|
#include <windows.h>
|
|
|
|
int main() {
|
|
HANDLE hComm; // Дескриптор порта
|
|
char *portName = "COM7"; // Имя порта
|
|
char *message = "Hello, World!"; // Сообщение для передачи
|
|
|
|
// Открытие порта
|
|
hComm = CreateFile(portName, // Имя порта
|
|
GENERIC_READ | GENERIC_WRITE, // Доступы для чтения и записи
|
|
0, // Семафор
|
|
NULL, // Атрибуты безопасности
|
|
OPEN_EXISTING, // Открытие существующего
|
|
FILE_FLAG_OVERLAPPED, // Флаги для асинхронной работы
|
|
NULL); // Дескриптор безопасности
|
|
|
|
// Если не удалось открыть порт
|
|
if (hComm == INVALID_HANDLE_VALUE) {
|
|
// - вывести ошибку и выйти из программы
|
|
printf("Error when opening port\n");
|
|
return 1;
|
|
}
|
|
|
|
// Настройка параметров порта
|
|
DCB dcbSerialParams = {0}; // Структура хранения параметров порта
|
|
dcbSerialParams.DCBlength = sizeof(dcbSerialParams); // Размер структуры
|
|
// Если не удалось получить параметры порта
|
|
if (!GetCommState(hComm, &dcbSerialParams)) {
|
|
// - вывести ошибку, закрыть дескриптор порта и выйти из программы
|
|
printf("Error when getting port state\n");
|
|
CloseHandle(hComm);
|
|
return 1;
|
|
}
|
|
// Установка параметров порта
|
|
dcbSerialParams.BaudRate = CBR_9600; // Скорость передачи данных
|
|
dcbSerialParams.ByteSize = 8; // Длина символа
|
|
dcbSerialParams.StopBits = ONESTOPBIT; // Количество стоповых бит (1)
|
|
dcbSerialParams.Parity = NOPARITY; // Четность (отсутствует)
|
|
|
|
// Если не удалось установить параметры порта
|
|
if (!SetCommState(hComm, &dcbSerialParams)) {
|
|
// - вывести ошибку, закрыть дескриптор порта и выйти из программы
|
|
printf("Error when setting port state\n");
|
|
CloseHandle(hComm);
|
|
return 1;
|
|
}
|
|
|
|
DWORD bytesWritten; // Количество переданных байт
|
|
OVERLAPPED overlapped = {0}; // Передача данных в асинхронном режиме
|
|
overlapped.hEvent = CreateEvent(NULL, // Определяет, может ли созданный объект события быть унаследован в дочерних процессах. При передаче значения NULL объект не может быть унаследован.
|
|
TRUE, // Будет ли событие установлено в несигнальное состояние после срабатывания (TRUE) или автоматически переходит в несигнальное состояние после ожидания одним потоком (FALSE).
|
|
FALSE, // Будет ли объект события создан в несигнальном (сброшенном) состоянии (FALSE) или в сигнальном состоянии (TRUE). вызова функции.
|
|
NULL); // Указатель на строку, содержащую имя объекта события. Если имя является уникальным, можно использовать значение NULL.
|
|
|
|
printf("Waiting to write...\n");
|
|
Sleep(2000);
|
|
|
|
// Асинхронная передача сообщения
|
|
if (!WriteFile(hComm, // Дескриптор порта
|
|
message, // Сообщение для передачи
|
|
strlen(message), // Размер сообщения
|
|
NULL, // Количество переданных байт (NULL для асинхронной работы)
|
|
&overlapped)) // Передача данных в асинхронном режиме
|
|
{
|
|
// Если не удалось асинхронно записать данные
|
|
if (GetLastError() != ERROR_IO_PENDING) {
|
|
printf("Error when writing to port\n");
|
|
CloseHandle(hComm);
|
|
return 1;
|
|
}
|
|
|
|
printf("Waiting to get result...\n");
|
|
Sleep(2000);
|
|
|
|
// Ожидание завершения асинхронной операции
|
|
if (!GetOverlappedResult(hComm, &overlapped, &bytesWritten, TRUE)) {
|
|
printf("Error when getting overlapped result\n");
|
|
CloseHandle(hComm);
|
|
return 1;
|
|
}
|
|
}
|
|
// Если сообщение было передано полностью
|
|
else {
|
|
bytesWritten = strlen(message);
|
|
}
|
|
printf("Message sent. Byte written: %lu\n", bytesWritten);
|
|
|
|
// Закрытие порта
|
|
CloseHandle(hComm);
|
|
|
|
return 0;
|
|
} |