dllbridge

Поиск COM_Arduino

Aug 20th, 2025
882
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1.  
  2.  
  3.  
  4. #include <windows.h>
  5. #include   <stdio.h>
  6. #include  <string.h>
  7. #include  <locale.h>  
  8.  
  9. /*
  10.  
  11. // Скетч для Arduino
  12. void setup()
  13. {
  14.   Serial.begin(9600);
  15. }
  16.  
  17. void loop()
  18. {
  19.   if (Serial.available() > 0)
  20.   {
  21.     String input = Serial.readString();
  22.     Serial.print("OK"); // Простой ответ
  23.   }
  24.   delay(100);
  25. }
  26.  
  27.  
  28. */
  29.  
  30.  
  31.  
  32. //////////////////////////////////////////////////////////////////////
  33. int is_arduino_port(const char* port_name, int baud_rate)           // Функция для проверки, является ли порт Arduino
  34. {
  35.    
  36.     HANDLE hSerial;
  37.     DCB dcbSerialParams = {0};
  38.     COMMTIMEOUTS timeouts = {0};
  39.     char test_command[] = "AT\r\n";
  40.     char response[256] = {0};
  41.     DWORD bytes_written, bytes_read;
  42.     int is_arduino = 0;
  43.  
  44.  
  45.     hSerial = CreateFile(port_name, GENERIC_READ | GENERIC_WRITE, 0, NULL,         // Открываем последовательный порт
  46.                         OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  47.    
  48.     if (hSerial == INVALID_HANDLE_VALUE)
  49.     {
  50.         return 0;
  51.     }
  52.  
  53.  
  54.     dcbSerialParams.DCBlength = sizeof(dcbSerialParams);                               // Настраиваем параметры порта
  55.     if (!GetCommState(hSerial, &dcbSerialParams))
  56.     {
  57.         CloseHandle(hSerial);
  58.         return 0;
  59.     }
  60.  
  61.     dcbSerialParams.BaudRate = baud_rate;
  62.     dcbSerialParams.ByteSize = 8;
  63.     dcbSerialParams.StopBits = ONESTOPBIT;
  64.     dcbSerialParams.Parity = NOPARITY;
  65.    
  66.     if (!SetCommState(hSerial, &dcbSerialParams))
  67.     {
  68.         CloseHandle(hSerial);
  69.         return 0;
  70.     }
  71.  
  72.  
  73.     timeouts.ReadIntervalTimeout         = 50;                                              // Устанавливаем таймауты
  74.     timeouts.ReadTotalTimeoutConstant    = 50;
  75.     timeouts.ReadTotalTimeoutMultiplier  = 10;
  76.     timeouts.WriteTotalTimeoutConstant   = 50;
  77.     timeouts.WriteTotalTimeoutMultiplier = 10;
  78.    
  79.     if (!SetCommTimeouts(hSerial, &timeouts))
  80.     {
  81.         CloseHandle(hSerial);
  82.         return 0;
  83.     }
  84.  
  85.                                                                                // Пытаемся отправить тестовую команду
  86.     if (WriteFile(hSerial, test_command, strlen(test_command), &bytes_written, NULL))
  87.     {
  88.         Sleep(100);                                                                                    // Ждем ответа
  89.        
  90.    
  91.         if (ReadFile(hSerial, response, sizeof(response) - 1, &bytes_read, NULL))         // Пытаемся прочитать ответ
  92.         {
  93.             response[bytes_read] = '\0';
  94.            
  95.            
  96.             if (bytes_read > 0)                               // Если получили какой-то ответ - вероятно это Arduino
  97.             {
  98.                 is_arduino = 1;
  99.             }
  100.         }
  101.     }
  102.  
  103.     CloseHandle(hSerial);
  104.     return is_arduino;
  105. }
  106.  
  107.  
  108. /////////////////////////////////////////////////////////////
  109. char* find_arduino_port(int baud_rate)                     // Функция для поиска Arduino на всех доступных COM-портах
  110. {
  111.     char port_name[10];
  112.     static char found_port[10] = {0};
  113.    
  114.     printf("Поиск Arduino Uno...\n");
  115.    
  116.    
  117.     for (int i = 1; i <= 30; i++)                                             // Проверяем COM-порты от COM1 до COM30
  118.     {
  119.         sprintf(port_name, "COM%d", i);
  120.         printf("Проверка порта %s... ", port_name);
  121.        
  122.         if (is_arduino_port(port_name, baud_rate))
  123.         {
  124.             printf("найдено Arduino!\n");
  125.             strcpy(found_port, port_name);
  126.             return found_port;
  127.         }
  128.         else  printf("не найдено\n");
  129.     }
  130.    
  131. return 0;
  132. }
  133.  
  134.  
  135. ////////////////////////////////////////////////////////////////
  136. int main()
  137. {
  138.     setlocale(LC_ALL, "rus");
  139.    
  140.     const int baud_rate = 9600;
  141.     char* arduino_port;
  142.    
  143.     printf("=== Поиск Arduino Uno ===\n");
  144.     printf("Скорость: %d бод\n\n", baud_rate);
  145.    
  146.     arduino_port = find_arduino_port(baud_rate);
  147.    
  148.     if (arduino_port != NULL)
  149.     {
  150.         printf("\n? Arduino найдено на порту: %s\n", arduino_port);
  151.         printf("Можно использовать этот порт для подключения.\n");
  152.     } else
  153.     {
  154.         printf("\n? Arduino не найдено!\n");
  155.         printf("Проверьте:\n");
  156.         printf("1. Подключен ли Arduino к компьютеру\n");
  157.         printf("2. Установлены ли драйверы CH340/CH341\n");
  158.         printf("3. Не занят ли порт другой программой\n");
  159.     }
  160.    
  161.     printf("\nНажмите Enter для выхода...");
  162.     getchar();
  163.    
  164. return 0;
  165. }
  166.  
  167.  
  168.  
Advertisement
Add Comment
Please, Sign In to add comment