디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

pc에 센서 연결하여 c언어로 종이컵 카운트앱에서 작성

나르시갤로그로 이동합니다. 2025.09.30 18:57:29
조회 119 추천 0 댓글 0

안녕하세요. 흥미로운 프로젝트를 진행하고 계시는군요\! 질문하신 내용에 대해 답변드리겠습니다.

결론부터 말씀드리면, **네, 프로그래밍으로 충분히 가능합니다.** 아두이노나 라즈베리파이 없이 센서를 PC에 연결하는 방법에 대해 이미 정확하게 파악하고 계십니다. 제시하신 대안들 모두 훌륭한 접근 방식이며, 각각의 장단점이 명확합니다.

아래에 각 방법에 대한 추가 설명과 요청하신 C언어 예제 코드를 정리해 드렸습니다.

-----

### \#\# 방법 1: RS-232C 제어 핀 활용

이해하신 대로, 구형 직렬 포트의 모뎀 제어 핀(CTS, DSR 등) 상태를 읽어오는 고전적이지만 훌륭한 방법입니다.

> **질문하신 내용에 대한 답변:** 최신 USB-to-RS232C 컨버터에서 제어 핀이 안정적으로 동작하는지는 **제품(내부 칩셋)에 따라 다릅니다.** FTDI 칩셋을 사용한 고급형 컨버터는 대부분 제어 핀 신호를 완벽하게 지원하지만, 저가형(예: CH340 칩셋) 제품 중 일부는 지원하지 않거나 불안정할 수 있습니다. 따라서 이 방법을 사용하시려면 컨버터 구매 시 **제조사 사양(Datasheet)을 꼭 확인**하셔야 합니다.

#### **C언어 예제 코드 (Windows API 기준)**

아래 코드는 "COM3" 포트를 열고, CTS 핀(Clear to Send)의 상태가 `HIGH`에서 `LOW`로 변하는 순간을 감지하여 컵 카운트를 1씩 증가시키는 전체 예제입니다.

```c
#include <windows.h>
#include <stdio.h>

int main() {
    // 1. 시리얼 포트 핸들 얻기
    HANDLE hSerial;
    // 사용하는 포트 번호에 맞게 "COM3"를 수정하세요.
    hSerial = CreateFile("COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    if (hSerial == INVALID_HANDLE_VALUE) {
        if (GetLastError() == ERROR_FILE_NOT_FOUND) {
            printf("오류: COM 포트를 찾을 수 없습니다.\n");
        } else {
            printf("오류: COM 포트를 여는 데 실패했습니다. (에러 코드: %lu)\n", GetLastError());
        }
        return 1;
    }

    // 2. 변수 초기화
    DWORD dwModemStatus;
    int cupCount = 0;
    BOOL bIsCtsOnPrev = FALSE; // CTS 핀의 이전 상태 (OFF로 초기화)

    printf("센서 감지를 시작합니다. 종료하려면 Ctrl+C를 누르세요.\n");

    // 3. 무한 루프를 돌며 핀 상태 폴링
    while (1) {
        // 현재 모뎀 상태(제어 핀 포함)를 가져옴
        if (!GetCommModemStatus(hSerial, &dwModemStatus)) {
            printf("오류: 포트 상태를 읽을 수 없습니다.\n");
            break;
        }

        // MSB_CTS_ON 플래그로 CTS 핀의 현재 상태 확인 (ON이면 TRUE)
        BOOL bIsCtsOnCurr = (dwModemStatus & MSB_CTS_ON);

        // 이전 상태는 ON(HIGH)이었고, 현재 상태는 OFF(LOW)일 때 카운트
        // (센서가 눌리면 GND와 연결되어 신호가 LOW가 되는 것을 가정)
        if (!bIsCtsOnCurr && bIsCtsOnPrev) {
            cupCount++;
            printf("컵 감지! 총 개수: %d\n", cupCount);
        }

        // 현재 상태를 이전 상태 변수에 저장
        bIsCtsOnPrev = bIsCtsOnCurr;

        // CPU 사용량을 줄이기 위해 50ms 대기
        Sleep(50);
    }

    // 4. 핸들 정리
    CloseHandle(hSerial);
    return 0;
}
```

-----

### \#\# 방법 2: USB 키보드/조이스틱 인코더 활용

가장 저렴하고 프로그래밍이 간편해 많은 메이커들이 애용하는 방식입니다. 하드웨어 제어가 아닌, OS 레벨의 표준 입력을 처리하는 접근법이 핵심입니다.

> **질문하신 내용에 대한 답변:** 네, 프로그램이 비활성화(백그라운드) 상태일 때도 키 입력을 감지할 수 있습니다. 이를 위해서는 **"전역 키보드 후킹(Global Keyboard Hooking)"** 기술을 사용해야 합니다. 운영체제(Windows)의 메시지 처리 시스템에 갈고리(Hook)를 걸어 키보드 입력 메시지를 가로채는 방식입니다.

#### **C언어 예제 코드 (Windows 저수준 키보드 후크)**

아래 코드는 특정 키(예: 'Q' 키)가 눌리는 것을 시스템 전역에서 감지하는 개념적인 예제입니다. 실제 프로젝트에서는 DLL로 만들거나 메시지 루프를 정교하게 처리해야 하지만, 핵심 로직을 이해하는 데 도움이 될 것입니다.

```c
#include <windows.h>
#include <stdio.h>

// 전역 변수
HHOOK _keyboardHook;
int cupCount = 0;

// 키보드 이벤트가 발생할 때마다 호출될 콜백 함수
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode >= 0) {
        // 키가 눌렸을 때 (WM_KEYDOWN)
        if (wParam == WM_KEYDOWN) {
            // lParam을 KBDLLHOOKSTRUCT 구조체로 캐스팅하여 정보 확인
            KBDLLHOOKSTRUCT* pKeyBoard = (KBDLLHOOKSTRUCT*)lParam;
           
            // 센서에 연결된 키가 'Q'키(Virtual Key Code: 0x51)라고 가정
            if (pKeyBoard->vkCode == 0x51) {
                cupCount++;
                printf("컵 감지 (키보드 신호)! 총 개수: %d\n", cupCount);
            }
        }
    }
    // 다음 훅 체인으로 메시지를 전달해야 시스템이 정상 동작함
    return CallNextHookEx(_keyboardHook, nCode, wParam, lParam);
}

int main() {
    printf("전역 키보드 감지를 시작합니다. (센서 키: 'Q')\n");

    // WH_KEYBOARD_LL 타입의 저수준 키보드 훅을 설치
    _keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
    if (_keyboardHook == NULL) {
        printf("오류: 키보드 훅 설치에 실패했습니다.\n");
        return 1;
    }

    // 프로그램이 바로 종료되지 않도록 메시지 루프를 실행
    // 실제 프로그램에서는 GUI 메시지 루프나 다른 대기 방법 사용
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
   
    // 프로그램 종료 전 훅 해제
    UnhookWindowsHookEx(_keyboardHook);
    return 0;
}

```

  * **컴파일 주의**: 위 코드는 Windows API를 사용하므로, Visual Studio나 MinGW 같은 Windows 환경용 컴파일러가 필요합니다.

-----

### \#\# 결론 및 최종 추천

두 방법 모두 훌륭하지만, 상황에 따라 추천이 달라집니다.

  * **단순한 취미 프로젝트, 빠른 프로토타이핑**: **USB 키보드 인코더 방식**을 강력히 추천합니다. +

      * **이유**: 하드웨어 의존성이 거의 없고, 가격이 매우 저렴하며, 프로그래밍이 직관적입니다. 전역 후킹을 이용하면 백그라운드에서도 잘 동작하여 원하는 기능을 문제없이 구현할 수 있습니다.

  * **안정성과 신뢰성이 중요한 시스템, 향후 확장 가능성 고려**: **USB I/O 모듈(DAQ)** 방식이 정답입니다.

      * **이유**: 산업용으로 설계되어 노이즈에 강하고 안정적입니다. 제조사에서 제공하는 잘 만들어진 SDK 덕분에 프로그래밍도 의외로 간편합니다. 초기 비용은 들지만 장기적으로는 가장 확실한 방법입니다.

궁금증이 해결되셨기를 바랍니다. 프로젝트 진행하시다가 또 막히는 부분 있으면 편하게 질문하세요\!

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 공개연애가 득보다 실인 것 같은 스타는? 운영자 25/10/06 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47807 65
2895292 'ㅎㅂ' 윤 공주 실시간 라방킴ㄱㄱ 프갤러(211.106) 01:54 1 0
2895291 'ㅎㅂ' 윤 공주 실시간 라방킴ㄱㄱ ㅇㅇ(121.176) 01:54 1 0
2895290 이재명이 잘하건 못하건 hrin(118.235) 01:52 2 0
2895289 'ㅎㅂ) 벗방 시작한 강 인 경 프갤러(211.106) 01:51 1 0
2895288 'ㅎㅂ' 윤 공주 실시간 라방킴ㄱㄱ ㅇㅇ(121.176) 01:49 1 0
2895286 혹시 감빵이나 구치소 3달이상 들어가본 사람 있음 ㅇㅅㅇ?? ㅇㅇ(223.38) 01:36 5 0
2895266 ㅆㅇㅆ님 갤북5프로 200만원짜리 사는거보다 [2] 프갤러(223.38) 10.10 31 0
2895264 당근에 소주한잔하자해서 만나면 무슨얘기함 ㅇㅅㅇ?? [1] ㅇㅇ(223.38) 10.10 23 0
2895254 "'검찰 마약수사 직무유기' 배후는 누구였나, 특검으로 규명해야" 발명도둑잡기(39.7) 10.10 12 0
2895251 오픈챝이나 당근에서 사람만나는거 비상식적인 방법임?? [1] ㅇㅇ(223.38) 10.10 34 0
2895245 혁거세 많이 파네 chironpractor갤로그로 이동합니다. 10.10 47 0
2895242 진보당 정책대토론회 발명도둑잡기(118.235) 10.10 14 0
2895239 나님 주무시기전 소통합니당⭐+ 질문 받음 [6] ♥덩냥이♥갤로그로 이동합니다. 10.10 55 0
2895237 [단독]‘양평 고속도로 특혜 변경’ 의혹 국토부 서기관, 뇌물 받고 8억 [1] 발명도둑잡기(39.7) 10.10 34 0
2895235 끙야하면 바루 자야징 [1] ♥덩냥이♥갤로그로 이동합니다. 10.10 37 0
2895234 추석에 OP 반값에 간 썰 ㅇㅇ(118.235) 10.10 23 0
2895231 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.10 24 0
2895224 양당제 만드는 선거제도를 안고치면 미국처럼 내전난다 [1] 발명도둑잡기(118.235) 10.10 22 0
2895223 핸들 인형 삿음 [2] 야옹아저씨갤로그로 이동합니다. 10.10 42 0
2895222 아오시발 한국 오자마자 모기 보네 류류(110.70) 10.10 20 0
2895221 찢두순 압도적 효능감 미춋당⭐ ♥덩냥이♥갤로그로 이동합니다. 10.10 25 0
2895220 내 글 왜 짜름? 프갤러(222.121) 10.10 23 0
2895218 햄버거에 눅눅한 양파 = 음식물쓰레기 ♥덩냥이♥갤로그로 이동합니다. 10.10 30 0
2895216 찢두순 vs 좌청래 내전반발 찢두순 극대노? ♥덩냥이♥갤로그로 이동합니다. 10.10 19 0
2895213 극좌무능 찢두순 관세협상 대참사 때문에 벌써 국민세금 3.4조 증발 ♥덩냥이♥갤로그로 이동합니다. 10.10 26 0
2895210 북괴정은의 탈모전개 [2] ♥덩냥이♥갤로그로 이동합니다. 10.10 35 0
2895209 극좌단체 민노총 선거범죄 [2] ♥덩냥이♥갤로그로 이동합니다. 10.10 30 0
2895207 흠.. 나님 칼럼쓰고 싶은데 체력이 애매하넹 [1] ♥덩냥이♥갤로그로 이동합니다. 10.10 38 0
2895205 냥덩이 ㅂㅅ 새끼 또 가짜뉴스 발명도둑잡기(211.246) 10.10 23 0
2895204 프갤이랑 뉴프로랑 글리젠 비슷하군요 헬마스터갤로그로 이동합니다. 10.10 27 0
2895203 ■요즘 신입 대세포폴이 뭐에요? [1] ㅇㅇ갤로그로 이동합니다. 10.10 53 0
2895202 칼집에서 검 뽑는거 루도그담당(58.239) 10.10 34 0
2895201 대재명 찬양자들 이재명 까기 바쁘군 ㅋㅋ [1] 나르시갤로그로 이동합니다. 10.10 33 1
2895200 같은말을 해도 목적에 따라 달라짐 ♥덩냥이♥갤로그로 이동합니다. 10.10 36 0
2895198 이재명 때문에 친중공산국가로 찍힌듯;; 한국여권가치 39위 수직하락 [1] ♥덩냥이♥갤로그로 이동합니다. 10.10 61 0
2895196 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.10 37 0
2895195 스프링 jpa 고수분들 질문드립니다 [1] 프갤러(219.255) 10.10 44 0
2895194 네카라쿠배 신입 합격자 평균 스펙이 어느정도임? [2] 프갤러(118.235) 10.10 59 0
2895193 C언어가 근본인 이유 [2] ㅇㅇ갤로그로 이동합니다. 10.10 76 0
2895192 지진 나기전에 출국 했음 ㅅㄱ [2] 류류(61.218) 10.10 50 0
2895191 이재명이 대통령된 후로 공산주의 같은 정책을 못 펼치는구나 ㅎㅎ [1] 나르시갤로그로 이동합니다. 10.10 50 0
2895190 현 정부 경제 정책을 시스템 아키텍처 관점에서 보니 드는 생각 [2] 나르시갤로그로 이동합니다. 10.10 77 1
2895189 주가, 환율 착시 효과 나르시갤로그로 이동합니다. 10.10 51 0
2895188 일본 지진때문에 정상화 당하고 있네 [3] 루도그담당(58.239) 10.10 94 0
2895187 앱히키는 씨발놈임 프갤러(118.235) 10.10 35 0
2895185 자료구조를 직접 구현할 일은 별로 없긴 하지만 개념은 중요함 [4] 프갤러(223.39) 10.10 116 1
2895184 스프링 같은 씹좆좆쓰지말고 [2] 루도그담당(58.239) 10.10 73 0
2895183 웹하는데 리액트 앱 라우터 방법도 모르면서 [2] ㅆㅇㅆ찡갤로그로 이동합니다. 10.10 75 0
2895182 C 공부세팅 완 [7] ㅇㅇ갤로그로 이동합니다. 10.10 98 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2