[Arduino] 사용중인 시리얼 포트 및 사용 프로세스 확인
Raspberry Pi & Arduino 2026. 5. 24. 11:05 |반응형
사용 중인 시리얼 포트를 확인해 보자.


C++, CreateFile 예제
#include <windows.h>
#include <iostream>
#include <string>
int main() {
std::cout << "Available COM Ports: \n";
for (int i = 1; i < 256; ++i) {
std::string portName = "\\\\.\\COM" + std::to_string(i);
// \\.\com (코드 작성 시 이스케이프 문자를 적용한 \\\\.\\com)는 Windows 운영체제에서 직렬 포트(Serial Port)나 병렬 포트(LPT) 같은 하드웨어 장치에 직접 접근하기 위한 경로 형식이다.
// 이 경로는 일반적으로 COM 포트에 접근할 때 사용된다. 예를 들어, COM1 포트에 접근하려면 "\\\\.\\COM1"과 같은 형식으로 경로를 지정한다.
// 이 방식은 Windows에서 하드웨어 장치와 통신하기 위해 사용되는 표준적인 방법 중 하나이다.
// 포트 번호가 10 이하인 경우에는 "COM1", "COM2"와 같이 간단히 사용할 수 있지만, 포트 번호가 10 이상인 경우에는 "\\\\.\\COM10"과 같이 전체 경로를 사용해야 한다.
HANDLE hComm = CreateFileA(
portName.c_str(), // 만들거나 열 파일 또는 디바이스의 이름.
GENERIC_READ | GENERIC_WRITE, //파일 또는 디바이스에 대한 요청된 액세스이며 읽기, 쓰기, 둘 다 또는 0으로 요약할 수 있다.
NULL, // 파일 또는 디바이스의 요청된 공유 모드.
NULL, // 보안 속성에 대한 포인터.
OPEN_EXISTING, // 파일이 존재하는 경우에만 열고, 그렇지 않으면 실패.
NULL, // 파일 또는 디바이스에 대한 플래그 및 속성.
NULL); // 템플릿 파일 핸들 또는 디바이스 핸들로 사용할 수 있는 유효한 핸들. 이 매개변수는 CreateFile이 새 파일을 만들 때만 사용. 이 매개변수는 일반적으로 NULL로 설정.
if (hComm != INVALID_HANDLE_VALUE) {
std::cout << "-> COM" << i << " is available.\n";
CloseHandle(hComm);
}
}
return 0;
}

C, QueryDosDevice 예제
#include <windows.h>
#include <stdio.h>
int main() {
char deviceName[256];
char comPort[16];
char openPortName[32];
printf("--- 사용 가능한 COM 포트 목록 ---\n");
// COM1부터 COM256까지 가능한 포트 번호를 순회하며 확인
for (int i = 1; i < 256; i++) {
sprintf_s(comPort, sizeof(comPort), "COM%d", i);
// QueryDosDevice를 이용해 해당 포트가 존재하는지 확인
DWORD result = QueryDosDeviceA(comPort, deviceName, sizeof(deviceName));
// CreateFile 함수로 포트를 열 때는 \\\\.\\COM10 형식을 써야 하지만, QueryDosDevice로
// 시스템에 등록된 장치 이름을 조회할 때는 접두사(\\.\)를 붙이면 안된다.
// 이 함수는 순수한 커널 장치 이름(예: COM1, COM10)만 인자로 받도록 설계되어 있다.
if (result != 0) { // result는 deviceName에 복사된 문자열의 길이.
// 실제 포트를 열거나 사용할 때는 "\\\\.\\" 접두사를 붙여서 출력 및 활용한다.
sprintf_s(openPortName, sizeof(openPortName), "\\\\.\\%s", comPort);
printf("%s 연결됨 (장치명: %s)\n", openPortName, deviceName);
}
}
return 0;
}

어떤 프로그램이 시리얼 포트를 사용 중인지 조사할 때 File Handle의 이름으로 위 그림의 해당 장치명을 지정해야 찾을 수 있다.
Process Explorer - Find - Find Handle or DLL... 클릭 - Handle or DLL substring에 장치명을 입력하고 Search 클릭


C# 예제
using System;
using System.IO.Ports;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
// PC에서 사용 가능한 모든 시리얼 포트 배열 가져오기
string[] ports = SerialPort.GetPortNames();
Console.WriteLine("사용 가능한 시리얼 포트:");
foreach (string port in ports)
{
Console.WriteLine(port);
}
// GetPortNames()는 PC에 잡혀있는 모든 포트를 반환하므로, 특정 포트가 현재 다른 프로그램에서
// 사용 중이거나 연결 가능한 상태인지 확인하려면 직접 Open()을 시도해 봐야 한다.
Console.WriteLine(Environment.NewLine + "연결 가능한 시리얼 포트:");
foreach (string port in ports)
{
using (SerialPort serialPort = new SerialPort(port))
{
try
{
serialPort.Open();
Console.WriteLine($"{port} : 연결 가능 (사용 가능)");
serialPort.Close();
}
catch (UnauthorizedAccessException)
{
Console.WriteLine($"{port} : 접근 거부 (다른 프로그램에서 사용 중)");
}
catch (Exception ex)
{
Console.WriteLine($"{port} : 오류 발생 - {ex.Message}");
}
}
}
}
}
}


Python, pyserial 예제
import serial.tools.list_ports
# 사용 가능한 포트 리스트 가져오기
ports = serial.tools.list_ports.comports()
print("연결된 시리얼 포트 목록:")
print("-" * 30)
if ports:
for port in ports:
print(f"포트 이름: {port.device}")
print(f"설명: {port.description}")
print(f"하드웨어 ID: {port.hwid}")
print("-" * 30)
else:
print("사용 가능한 시리얼 포트가 없습니다.")

반응형
'Raspberry Pi & Arduino' 카테고리의 다른 글
| [Arduino] USB to UART 사용 컴퓨터 시리얼 통신 (0) | 2026.05.22 |
|---|---|
| [RetroPie] Runcommand Script (0) | 2026.05.20 |
| [Arduino] FIS Low concentration solvent gas sensor module (0) | 2026.05.15 |
| [Arduino] Arduino Serial Communication with C# - 아두이노 시리얼 통신 3 (0) | 2026.05.09 |
| Linux development board Luckfox Pico Mini A/B & Plus (1) | 2025.02.28 |
