#include #include 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; }