디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.30 18:57:29
조회 67 추천 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
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 우리나라를 대표해서 UN 연설자로 내보내고 싶은 스타는? 운영자 25/09/29 - -
AD 프로게이머가 될테야!! 운영자 25/10/01 - -
공지 프로그래밍 갤러리 이용 안내 [96] 운영자 20.09.28 47559 65
2893258 210.217 류도그는 왜 이래 열등감에 절어사냐 ㅆㅇㅆ찡갤로그로 이동합니다. 15:04 11 0
2893257 10점 만점에 몇점짜리 좆소냐? ㅇㅇ(175.200) 15:04 9 0
2893256 오늘도 일해야하는 내신세 서글프다 ㅆㅇㅆ찡갤로그로 이동합니다. 14:27 19 0
2893255 근데 영포티만 쳐맞고 있는게 웃김 [1] ♥냥덩이♥갤로그로 이동합니다. 14:23 23 0
2893254 미연시도 안하는 내가 전공을 잘 살릴 수 있는거냐 공기역학갤로그로 이동합니다. 13:59 20 0
2893252 카톡의 불가사의 ㅎㅎ [2] 나르시갤로그로 이동합니다. 13:58 18 0
2893251 빨리 인사쪽 ai가 점령했으면 좋겠음 ㅇㅇ(211.210) 13:57 14 0
2893250 카톡이 무리수를 너무 많이 두었지 나르시갤로그로 이동합니다. 13:55 15 0
2893249 나는 플러팅 와도 걍씹음 프갤러(210.217) 13:30 33 1
2893247 33살 될때까지 모솔이라 20대 여자가 웃어주기만 해도 설렘 ㅇㅇ갤로그로 이동합니다. 13:26 19 0
2893246 리재명 배급쿠폰 소비진작 반짝 물가만 폭등했다 경재실패 책임대두 ♥냥덩이♥갤로그로 이동합니다. 13:03 11 0
2893245 리재명 유체이탈 말장난? 물가 원인은 중간업자노조와 양곡법 때문 ♥냥덩이♥갤로그로 이동합니다. 13:00 11 0
2893243 퐁퐁남만 있는게 아님 ♥냥덩이♥갤로그로 이동합니다. 12:20 16 0
2893242 나는조현병이야 나는내향적이야 손발이시립디다갤로그로 이동합니다. 12:19 26 0
2893241 [애니뉴스] 귀인환등초 24화 감상 프갤러(121.172) 11:57 13 0
2893240 카카오 존나 웃기긴 함 [17] 루도그담당(211.184) 11:55 96 0
2893239 ㅆㅇㅆ = 남이 만든거 외주 받고 내가만들었다~! [1] 프갤러(210.217) 11:12 72 4
2893236 3년 전쯤만 해도 게시판 만들줄 알면 취업했는데 [1] 프갤러(59.15) 10:36 34 0
2893234 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10:02 14 0
2893233 카톡 타로 공통점 ㅇㅇ(211.234) 08:54 50 4
2893232 오늘 아침 짙은 안개..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:53 22 0
2893231 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 08:52 20 0
2893230 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 08:50 28 0
2893229 무비자 중국인 한국인 폭행에 뺑소니 ♥냥덩이♥갤로그로 이동합니다. 08:23 30 0
2893227 조용히 사라지는 한국인과 중국인 무비자 입국 ♥냥덩이♥갤로그로 이동합니다. 07:42 19 0
2893226 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 07:31 33 0
2893225 [단독]디시인사이드 주인 ‘에이치PE’로 바뀐다 발명도둑잡기(118.216) 05:09 37 0
2893224 인터넷 끊어놔도 계속되는 해킹..'비밀번호 잠금' 태블릿까지 뚫려 [2] 발명도둑잡기(118.216) 04:51 28 0
2893223 극우단체 반중시위는 보수주의자가 사실 겁이 많은 성격이기 때문이다 [1] 발명도둑잡기(118.216) 04:38 26 0
2893222 '쿠팡 압수수색 증거 누락' 지적한 부장검사를 감찰조사…대검은 왜 발명도둑잡기(118.216) 04:20 29 0
2893221 너무 서럽다. 내란당에 싸운 세월. 내 핸드폰도 골고다 언덕을 건넜데이. 넥도리아(220.74) 04:05 46 0
2893220 국민의힘 해체를 반드시 막는 철옹성 필수 요소 발명도둑잡기(118.216) 03:47 17 0
2893217 분석능력과 타인에 대한 공감능력은 트레이드오프관계 발명도둑잡기(118.216) 03:28 25 0
2893212 몽골서 우리 기술로 40년 만에 벼 재배 발명도둑잡기(118.216) 02:55 16 0
2893211 미국 트럼프 SNS 검열 소송 발명도둑잡기(118.216) 02:51 13 0
2893210 부모님이 파워 수리하는데 돈들이지 말고 수리하래요. 미친년, 넥도리아(220.74) 02:48 25 0
2893208 씨피유 전압 검사기 발명도둑잡기(118.216) 02:39 14 0
2893206 [단독] "윤석열 24시간 수발" 교도관 의혹 폭로‥근무일지도 안 남긴 발명도둑잡기(118.216) 02:38 22 0
2893204 번아웃 극복법 3가지 발명도둑잡기(118.216) 02:11 22 0
2893202 미국에게 한국은 우방이 아니라 민감국가가 팩트고, 통화스와프도 안해준다 발명도둑잡기(118.216) 02:03 22 0
2893201 미국이 관세협상에서 한국에 집착하는 이유 발명도둑잡기(118.216) 01:59 21 0
2893200 초전력·영하에도 '거뜬'...정류장·카페까지 전자종이로 발명도둑잡기(118.216) 01:53 19 0
2893199 베트남 잘 나갈 것이다 발명도둑잡기(118.216) 01:45 33 0
2893198 한때 잘나가던 EA, 사모펀드에 인수 발명도둑잡기(118.216) 01:30 23 0
2893193 ㅆㅇㅆ 지가 외주받느거 소스빼와서 [3] 프갤러(210.217) 01:18 88 5
2893191 오늘의 발명 실마리: 핵융합 대기권 드론과 위성 발명도둑잡기(118.216) 01:00 19 0
2893190 그래픽스가 어려움 ai 개발이 어려움 타이밍뒷.통수한방(1.213) 00:46 31 0
2893189 '한국은 전쟁터가 될 것인가' '팍스 아메리카나의 종말' 발명도둑잡기(118.216) 00:33 25 0
2893188 대입 연산자를 <- 로 바꾸면, 언어 도태됨? ㅇㅇ(106.241) 00:24 27 0
뉴스 김태호 PD, 광희 ‘고가 출연료’ 저격 “그 돈이면…” 디시트렌드 09.30
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2