From 06ca39a39426e86bc0dcc365da2820be32744af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=83=D1=81=D0=BB=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Tue, 16 Jan 2024 14:05:28 +0300 Subject: [PATCH] L4 - v1 --- .idea/modules.xml | 2 +- CMakeLists.txt | 5 +- main.c | 366 ++++++++++------------------------------------ text.txt | 21 --- text2.txt | 21 --- text3.txt | 0 6 files changed, 83 insertions(+), 332 deletions(-) delete mode 100644 text.txt delete mode 100644 text2.txt delete mode 100644 text3.txt diff --git a/.idea/modules.xml b/.idea/modules.xml index 5831729..e63d5f2 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 68efe60..9c97d58 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.26) -project(untitled C) +project(untitled1 C) set(CMAKE_C_STANDARD 11) -add_executable(untitled main.c) +add_executable(untitled1 main.c +) diff --git a/main.c b/main.c index bdeaff4..89fc065 100644 --- a/main.c +++ b/main.c @@ -1,302 +1,94 @@ + #include #include -#include -int getLogicalDriveStrings() { - printf("- GetLogicalDriveStrings:\n"); - char buffer[4096]; // - DWORD bufSize = sizeof(buffer) - 1; // , +int main() { + HANDLE hComm; // Дескриптор порта + char *portName = "COM7"; // Имя порта + char *message = "Hello, World!"; // Сообщение для передачи - GetLogicalDriveStrings(bufSize, buffer); // - char *drive = buffer; - while (*drive) { // - printf(": %s\n", drive); - // - drive += strlen(drive) + 1; - } - return 0; -} -int getVolumeInformation() { - printf("- GetVolumeInformation:\n"); - char volumeName[256]; - char fileSystemName[256]; - DWORD serialNumber; - DWORD maxComponentLength; - DWORD fileSystemFlags; + // Открытие порта + hComm = CreateFile(portName, // Имя порта + GENERIC_READ | GENERIC_WRITE, // Доступы для чтения и записи + 0, // Семафор + NULL, // Атрибуты безопасности + OPEN_EXISTING, // Открытие существующего + FILE_FLAG_OVERLAPPED, // Флаги для асинхронной работы + NULL); // Дескриптор безопасности - // - GetVolumeInformation("C:\\", // , - volumeName, // , - sizeof(volumeName), // - &serialNumber, // , - &maxComponentLength, // - &fileSystemFlags, // - fileSystemName, // - sizeof(fileSystemName)); // - printf(" : %s\n", volumeName); - printf(" : %lu\n", serialNumber); - printf("Max Component Length: %lu\n", maxComponentLength); - printf(" : %s\n", fileSystemName); - printf("File System Flags: %lu\n", fileSystemFlags); - return 0; -} - -// --- -long getFileSize() { - printf("- GetFileSize:\n"); - HANDLE hFile; - DWORD fileSize; - unsigned long structLargeInt; - // - hFile = CreateFile((LPCSTR) "../text.txt", - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - // - structLargeInt = GetFileSize(hFile, NULL); - - // - CloseHandle(hFile); - - // - printf(" : %lu \n", structLargeInt); - return 0; -} -int findNextFile() { - printf("- FindNextFile:\n"); - WIN32_FIND_DATA findData; - HANDLE hFind; - char path[MAX_PATH]; - - // , - strcpy(path, "..\\*"); - - // / - hFind = FindFirstFile(path, &findData); - - // - do { - if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - printf(": %s\n", findData.cFileName); - } else { - printf("\t: %s\n", findData.cFileName); - } - } while (FindNextFile(hFind, &findData)); - - // - FindClose(hFind); - - return 0; -} -int getWindowsDirectory() { - printf("- GetWindowsDirectory:\n"); - char windowsDir[255]; // - - GetWindowsDirectory(windowsDir, sizeof(windowsDir)); - - printf(" : %s\n", windowsDir); - return 0; -} -int compareFileTime() { - printf("- CompareFileTime:\n"); - FILETIME fileTime1; - FILETIME fileTime2; - - // - HANDLE file1 = CreateFile((LPCSTR) "../text.txt", - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - // - GetFileTime(file1, NULL, NULL, &fileTime1); - - // - CloseHandle(file1); - - // - HANDLE file2 = CreateFile((LPCSTR) "../text2.txt", - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - // - GetFileTime(file2, NULL, NULL, &fileTime2); - - // - CloseHandle(file2); - - // - int comparisonResult = CompareFileTime(&fileTime1, &fileTime2); - - if (comparisonResult == 1) { - printf(" 1 2\n"); - } else if (comparisonResult == -1) { - printf(" 2 1\n"); - } else { - printf(" \n"); - } - - return 0; -} - -// --- -int setLocalTime() { - printf("- SetLocalTime:\n"); - // SYSTEMTIME - SYSTEMTIME systemTime; - - // SYSTEMTIME - GetLocalTime(&systemTime); - printf("\n : %02d-%02d-%d %02d:%02d:%02d\n", - systemTime.wDay, systemTime.wMonth, systemTime.wYear, - systemTime.wHour, systemTime.wMinute, systemTime.wSecond); - - // 1 - if (systemTime.wHour < 23) { - systemTime.wHour++; - } else { - systemTime.wHour = 0; - } - - // SetLocalTime - SetLocalTime(&systemTime); - printf(" \n"); - - printf("\n : %02d-%02d-%d %02d:%02d:%02d\n", - systemTime.wDay, systemTime.wMonth, systemTime.wYear, - systemTime.wHour, systemTime.wMinute, systemTime.wSecond); - - return 0; -} -int setFileAttributes() { - - printf("- SetFileAttributes:\n"); -// G - LPCWSTR filePath = L"..\\text3.txt"; - // - SetFileAttributes((LPCSTR) filePath, (DWORD) NULL); - // - DWORD fileAttributes = GetFileAttributes((LPCSTR) filePath); - printf("\t : "); - if (fileAttributes & FILE_ATTRIBUTE_READONLY) { - printf("\n- Read-only"); - } - if (fileAttributes & FILE_ATTRIBUTE_HIDDEN) { - printf("\n- Hidden"); - } - if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - printf("\n- Directory"); - }// ... - printf("\n"); - - // - DWORD newFileAttributes = FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_DIRECTORY |fileAttributes; - BOOL result = SetFileAttributes((LPCSTR) filePath, (DWORD) newFileAttributes); - - fileAttributes = GetFileAttributes((LPCSTR) filePath); - - printf("\t : "); - if (fileAttributes & FILE_ATTRIBUTE_READONLY) { - printf("\n- Read-only"); - } - if (fileAttributes & FILE_ATTRIBUTE_HIDDEN) { - printf("\n- Hidden"); - } - if (fileAttributes & FILE_ATTRIBUTE_DIRECTORY) { - printf("\n- Directory"); - }// ... - printf("\n"); - - return 0; -} -int createFile() { - printf("- CreateFile:\n"); - HANDLE hFile; - char* fileName = "example.txt"; - - // - hFile = CreateFile(fileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - // - char* data = "Hello, World!"; - DWORD bytesWritten; - WriteFile(hFile, data, strlen(data), &bytesWritten, NULL); - - // - CloseHandle(hFile); - - // - hFile = CreateFile(fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); - - // - const int bufferSize = 100; - char buffer[bufferSize]; - DWORD bytesRead; - if (!ReadFile(hFile, buffer, bufferSize, &bytesRead, NULL)) - { - printf("Failed to read from file.\n"); - CloseHandle(hFile); + // Если не удалось открыть порт + if (hComm == INVALID_HANDLE_VALUE) { + // - вывести ошибку и выйти из программы + printf("Error when opening port\n"); return 1; } - // - printf(" : %.*s\n", bytesRead, buffer); + // Настройка параметров порта + 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; // Четность (отсутствует) - // - CloseHandle(hFile); - - return 0; -} -void copyFile(const char* sourceFile, const char* destinationFile) { - printf("- CopyFile:\n"); - - FILE* source = fopen(sourceFile, "rb"); - FILE* destination = fopen(destinationFile, "wb"); - - // - char buffer[1024]; - size_t bytesRead; - while ((bytesRead = fread(buffer, 1, sizeof(buffer), source)) > 0) { - fwrite(buffer, 1, bytesRead, destination); + // Если не удалось установить параметры порта + if (!SetCommState(hComm, &dcbSerialParams)) { + // - вывести ошибку, закрыть дескриптор порта и выйти из программы + printf("Error when setting port state\n"); + CloseHandle(hComm); + return 1; } - // - fclose(source); - fclose(destination); + DWORD bytesWritten; // Количество переданных байт + OVERLAPPED overlapped = {0}; // Передача данных в асинхронном режиме + overlapped.hEvent = CreateEvent(NULL, // Определяет, может ли созданный объект события быть унаследован в дочерних процессах. При передаче значения NULL объект не может быть унаследован. + TRUE, // Будет ли событие установлено в несигнальное состояние после срабатывания (TRUE) или автоматически переходит в несигнальное состояние после ожидания одним потоком (FALSE). + FALSE, // Будет ли объект события создан в несигнальном (сброшенном) состоянии (FALSE) или в сигнальном состоянии (TRUE). вызова функции. + NULL); // Указатель на строку, содержащую имя объекта события. Если имя является уникальным, можно использовать значение NULL. - printf(" .\n"); -} + 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); -int main() { - setlocale(LC_ALL, "Rus"); - printf("\n----------------------------\n"); - printf("\t :\n"); - // getLogicalDriveStrings();// + - // getVolumeInformation();// + - printf("\n------------------------------------------\n"); - printf("\t :\n"); - // getFileSize();// + - // findNextFile();// + - // getWindowsDirectory();// + - // compareFileTime();// + - printf("\n----------------------------\n"); - printf("\t :\n"); - // setLocalTime();// + - // setFileAttributes();// + - // createFile();// / - const char* sourceFile = ".//text.txt"; - const char* destinationFile = ".//text33.txt"; - CopyFile(".//text.txt", ".//text3.txt", 0);// -} + // Ожидание завершения асинхронной операции + 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; +} \ No newline at end of file diff --git a/text.txt b/text.txt deleted file mode 100644 index 6461503..0000000 --- a/text.txt +++ /dev/null @@ -1,21 +0,0 @@ -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan - -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsanss -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -text.txttext.txttext.txt - -text.txttext.txttext.txttext.txtsss -text.txttext.txttext.txttext.txt - - -text.txttext.txttext.txt -text.txtss -text.txt -text.txt -text.txt -text.txttexttext.txtss \ No newline at end of file diff --git a/text2.txt b/text2.txt deleted file mode 100644 index 51762f3..0000000 --- a/text2.txt +++ /dev/null @@ -1,21 +0,0 @@ -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan - -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsanss -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -;lkadsnf;lkjsd;cjsa;dijwaijfiaejfaiosjfs;lknv;lsan -text.txttext.txttext.txt - -text.txttext.txttext.txttext.txt -text.txttext.txttext.txttext.txt - - -text.txttext.txttext.txt -text.txt -text.txt -text.txt -text.txt -text.txttexttext.txtывыфвывыав \ No newline at end of file diff --git a/text3.txt b/text3.txt deleted file mode 100644 index e69de29..0000000