ArhEVM_Labs/main.c
Суслов Роман 06ca39a394 L4 - v1
2024-01-16 14:05:28 +03:00

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