디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.30 18:57:29
조회 123 추천 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 - -
2893502 근데 상법개정이랑 배임죄 폐지는 상충하는거 아님? [4] ㅇㅇ(121.168) 10.02 91 0
2893501 뭔지랄을 했길래 하필 남쪽에서 태어났을까 ㅅㅂ [10] 타이밍뒷.통수한방(1.213) 10.02 99 0
2893500 질투 인민 공화국에 태어나신걸 환영합니다. [3] ㅇㅇ(121.168) 10.02 70 0
2893499 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [2] ♥덩냥이♥갤로그로 이동합니다. 10.02 88 0
2893498 ai 재앙은 저능아 바이브코더에 의해 올겁니다. [1] 프갤러(218.154) 10.02 95 0
2893497 ai가 개똥코드 싸질러서 rewrite하는데 그걸 또 ai로 한다고? [4] 프갤러(218.154) 10.02 127 0
2893496 찢은 보수진보 대통합을 이루고 국가붕괴시킴 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 10.02 35 0
2893495 rewrite it 정도는 ㅇㅇ갤로그로 이동합니다. 10.02 48 0
2893494 카카오톡 드디어 레전드 평점 돌파 [3] 헬마스터갤로그로 이동합니다. 10.02 112 0
2893493 한국을 예견한 미국 드라마 ㅇㅇ(121.168) 10.02 61 0
2893492 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [3] ♥덩냥이♥갤로그로 이동합니다. 10.02 81 1
2893491 드디어 3 모니터 구축했다. 2년만에... 넥도리아(220.74) 10.02 46 0
2893489 [kt cloud x goorm] IT 직군 개발 / 비개발 8개 과정 프갤러(14.32) 10.02 829 0
2893488 디씨는 서버 이중화 되어있을까? ㅇㅅㅇ [3] 헤르 미온느갤로그로 이동합니다. 10.02 97 0
2893487 틀딱 프붕이 국비 붙었어 [1] ㅇㅇㅇ(125.130) 10.02 107 1
2893486 인생은 운이야 [3] ㅇㅇ(121.168) 10.02 70 0
2893485 동네 꽃가게 추석대목 준비완료 ㅇㅅㅇ [1] 헤르 미온느갤로그로 이동합니다. 10.02 74 0
2893484 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 10.02 45 0
2893483 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 10.02 57 0
2893482 외국도 rewrite it in rust 하고 있는데 언어는 그저 [2] 프갤러(218.153) 10.02 87 0
2893481 나는내향적이야 나는조현병이야 [4] 손발이시립디다갤로그로 이동합니다. 10.02 77 0
2893471 멘헤라 모모링..❤ ♥냥덩이♥갤로그로 이동합니다. 10.02 51 0
2893460 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10.02 58 0
2893452 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥덩냥이♥갤로그로 이동합니다. 10.02 74 0
2893449 외국도 초급/저연차 프로그래머들 다 잘리고 있는데 AI는 그저 [2] 프갤러(220.70) 10.02 101 0
2893415 컴공 학식 2학년인데 어케해야할까요 [1] ㅇㅇ(211.60) 10.02 123 0
2893387 트럼프에 등 돌리는 MAGA! 원인은 엡스타인이 아니라 '딥스테이트'? 발명도둑잡기(118.216) 10.02 47 0
2893385 노인들이 인생이 노력이랬다가 운이라고하는데 정신 못차려서 그럼 타이밍뒷.통수한방(1.213) 10.02 53 0
2893384 이스라엘 삐삐 원격 폭파처럼 노트북, 서버 배터리 원격 폭발 공작 발명도둑잡기(118.216) 10.02 81 0
2893381 찢은 보수진보 대통합을 이루고 국가붕괴시킴 ㅋㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 10.02 39 0
2893379 정부 클라우드 복구불가 혹시 내란세력 증거 소멸 목적? 발명도둑잡기(118.216) 10.02 50 0
2893377 미국 국기 이모티콘은 두개 발명도둑잡기(118.216) 10.02 37 0
2893376 카카오 코테.. c없네.. 프갤러(112.170) 10.02 322 0
2893371 리눅스 창시자 리누스 방한하면 유퀴즈에 나와야 합니다 [1] 발명도둑잡기(118.216) 10.02 74 0
2893367 요즘은 국비교육 인기가 없나보네 [3] 프갤러(219.251) 10.02 185 0
2893366 근데 오히려 못생긴거<<이거 나름 나쁘지 않은듯 [1] ㅆㅇㅆ(113.192) 10.02 76 0
2893364 북돼지새끼는 왜 외제품 사용하는거임?? 타이밍뒷.통수한방(1.213) 10.02 50 0
2893363 커널 패치가드 조지는 중인데 루도그담당(58.239) 10.02 56 0
2893362 오늘의 영화 실마리: 온라인게임 역사 다큐 발명도둑잡기(118.216) 10.02 52 0
2893360 수면쉬야햇당 [2] ♥냥덩이♥갤로그로 이동합니다. 10.02 78 0
2893359 울트라리스크 [2] ♥냥덩이♥갤로그로 이동합니다. 10.01 80 0
2893358 남자도 여신 유튜버 되기 가능 발명도둑잡기(118.216) 10.01 41 0
2893357 뭔가 덥넹 ♥냥덩이♥갤로그로 이동합니다. 10.01 63 0
2893356 애인과 수갑 한쪽씩 차면 뭐 하고 놀아야 하나요? 발명도둑잡기(118.216) 10.01 36 0
2893355 너희 좃찐따라서 나님 없으면 개노잼이잖아 [1] ♥냥덩이♥갤로그로 이동합니다. 10.01 62 0
2893354 나는 supabase의 기능중에 db를 벡터화 하는게 존나 편해서 ㅆㅇㅆ찡갤로그로 이동합니다. 10.01 62 0
2893353 나도 만약 성공했으면 운이 좋았다라고 변명했을듯 타이밍뒷.통수한방(1.213) 10.01 51 0
2893352 인생이 운이라는새끼는 그냥 집안이 좋은새끼들이나 하는 핑계거리이지 타이밍뒷.통수한방(1.213) 10.01 52 0
2893351 CIA에 신고한 냥덩이 외환죄로 최고 사형 가능 [1] 발명도둑잡기(118.216) 10.01 57 0
2893350 실력이라 포장된 운에 현혹되지 말기를 바래 ㅇㅇ(121.168) 10.01 43 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2