디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.30 18:57:29
조회 106 추천 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 - -
2893826 이번 추석명절 유흥 반값에 가는법 꿀팁 ㅇㅇ(118.235) 10.04 49 0
2893825 4050이 나라를 살린다 [2] 야옹아저씨갤로그로 이동합니다. 10.04 76 1
2893821 막걸리 한 병 깠다 [4] ㅇㅇ(121.168) 10.03 69 0
2893818 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥덩냥이♥갤로그로 이동합니다. 10.03 83 0
2893816 나님 내년 1분기까지 노워킹 온리조깅으로 30km 도전 [2] ♥냥덩이♥갤로그로 이동합니다. 10.03 73 0
2893813 현시대는 토발즈도 1찍 짱깨편인 무서운 시대이다ㅋㅋ번식 더 해줘라 이기 타이밍뒷.통수한방(1.213) 10.03 34 0
2893809 지듣노 ㅁㅌㅊ? [3] 노력갤로그로 이동합니다. 10.03 70 1
2893808 인생은 운이다 [2] ㅇㅇ(121.168) 10.03 71 1
2893807 걷기 싫어하는 나님의 습성도 리죄명 짱깨 무비자 입국에서 비롯됐다 [3] ♥냥덩이♥갤로그로 이동합니다. 10.03 68 0
2893805 ㄸㄸㄹ ♥냥덩이♥갤로그로 이동합니다. 10.03 42 0
2893801 rtos 리스트 하드웨어 잘되는 순서로 정렬 발명도둑잡기(118.216) 10.03 69 0
2893799 ■요즘 Si 신입 대세포폴이 뭐에요? [4] ㅇㅇ갤로그로 이동합니다. 10.03 96 0
2893795 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10.03 62 0
2893794 저녁 아직 안 먹었는데 [1] 발명도둑잡기(118.216) 10.03 71 0
2893793 노오오력 하면 된단다 발명도둑잡기(118.216) 10.03 49 0
2893791 엠마 왓슨이 범죄의 아이콘이 된 이유 발명도둑잡기(118.216) 10.03 59 0
2893789 Wolfenstein3D on 8bit consoles 발명도둑잡기(118.216) 10.03 46 0
2893786 공부에 다른방도 없는듯... 그냥 매일 계속 꾸준히 하는것밖에 없음 ㅇㅇ(223.39) 10.03 51 1
2893782 차단해도 댓글 계속 달리는거 ㄹㅇ 짜증남 ㅆㅇㅆ(124.216) 10.03 58 1
2893778 ㅆㅇㅆ 접밥 비린내나는 새기가 먼 gpt를 이겨 ㅋㅋ 프갤러(210.217) 10.03 106 8
2893777 내가 느끼는게 아무리 날고 기어도 구현을 지피티 못이기겠음 [2] ㅆㅇㅆ(124.216) 10.03 105 0
2893776 일본 취업 유학 워홀 여행 관련모임 ㅇㅇ(106.146) 10.03 81 0
2893775 형이 드디어 돈복사 프로그램 만듬 [1] ㅇㅇ(14.5) 10.03 68 0
2893773 이번에 GPT랑 나랑 같은거 코딩해봤는데 지피티가 훨 낫더라. [2] ㅆㅇㅆ(124.216) 10.03 102 3
2893772 힙합 갤러리 10조 갑부 발명도둑잡기(118.235) 10.03 45 0
2893769 ■WSL→도커→이클립스 이렇게쓰는데 쓸데없는짓임? [4] ㅇㅇ갤로그로 이동합니다. 10.03 93 0
2893768 오늘 중국친구가 나보고 재능있대서 기분좋음 [3] ㅆㅇㅆ찡갤로그로 이동합니다. 10.03 79 0
2893764 여러분 ai 코딩 플러그인으로 쓰시나요? [1] ㅇㅇ(106.102) 10.03 56 0
2893761 이번 연휴 달붕이들 꿀팁 푼다 꼭 봐라ㅋㅋㅋㅋ ㅇㅇ(118.235) 10.03 54 0
2893760 AI 로 코딩하기.....ㅋㅋㅋㅋ [1] 프갤러(59.16) 10.03 86 0
2893759 전자담배로 해킹 발명도둑잡기(118.235) 10.03 51 0
2893758 [애니뉴스] 귀인환등초 24화 완결? 프갤러(121.172) 10.03 46 1
2893757 [대한민국] 모스탄, 세계 대전 언급, 고든창 박사, 이재명 차기 독재자 [1] 프갤러(121.172) 10.03 65 0
2893755 전자담배 해킹 [2] 발명도둑잡기(118.235) 10.03 56 0
2893754 취직후 회사 내 노트북 쓰려고 가져가면 "윈도우정품" << 문제됨? [6] 프갤러(180.230) 10.03 81 0
2893753 일회용 전담에 아치 깔아봄 [7] 프갤러(1.250) 10.03 106 2
2893751 내 자신을 회복하는 중이다 ㅇㅇ(121.168) 10.03 50 0
2893750 5시간 반 잤더니 졸리다 발명도둑잡기(118.216) 10.03 44 0
2893749 본인 버킷리스트 [7] 공기역학갤로그로 이동합니다. 10.03 99 0
2893748 지금 갑자기 놀이라는 단어가 매우 안익숙하게 느껴짐 [7] 공기역학갤로그로 이동합니다. 10.03 79 0
2893747 엔젤리너스 바람물질인 검은빨대 사용하는군요 [1] 헬마스터갤로그로 이동합니다. 10.03 56 1
2893746 다시 보는 드럼통의 청와대 ㅇㅇ(121.168) 10.03 58 1
2893745 게임땔깜지망생에서 은퇴한이유 [36] 공기역학갤로그로 이동합니다. 10.03 163 0
2893744 머릿속에 약간 해줘마인드가 들어간거같음 [13] 공기역학갤로그로 이동합니다. 10.03 92 0
2893743 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.03 50 2
2893742 정부서버 불낸 책임자 극단자했다는군요 [13] 헬마스터갤로그로 이동합니다. 10.03 141 0
2893741 노인개씹버러지새끼들 요즘 100세인생이라고 안해서 좋다 ㅋㅋㅋ [1] 타이밍뒷.통수한방(1.213) 10.03 57 0
2893739 추석 연휴 업소 가는 형들 꿀팁 반값 꿀팁 풀게ㅅㅅㅅ [2] ㅇㅇ(39.7) 10.03 62 1
2893738 좆븅신이 지가 잘난줄 아는 이유 프갤러(210.217) 10.03 64 3
2893737 진짜 개발자가 설명 못하는이유 [1] 프갤러(210.217) 10.03 107 2
뉴스 김수현, 김나영 재혼 등 연예계 희비 디시트렌드 10.06
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2