디시인사이드 갤러리

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

갤러리 본문 영역

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

나르시갤로그로 이동합니다. 2025.09.30 18:57:29
조회 116 추천 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 - -
2893317 4ㅌㅊ는 내년 1분기안에 가느응~?!? ♥냥덩이♥갤로그로 이동합니다. 10.01 49 0
2893315 금월까지 가능할듯? ♥냥덩이♥갤로그로 이동합니다. 10.01 38 0
2893314 우분투 제발 살려주세요 [5] 프갤러(210.97) 10.01 72 0
2893312 야 개발 스텍이 어떻고 실력이 어떻고 다 의미 없어. gilgarion(211.235) 10.01 63 0
2893311 오라클 ms 토발즈 머스크 보면 it쪽이 좌파인이유알수있지않누?? 타이밍뒷통수한방(1.213) 10.01 39 0
2893310 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10.01 36 0
2893308 이 사람은 통신 패킷, 직렬화 개념을 모르시는 듯 [4] 나르시갤로그로 이동합니다. 10.01 83 0
2893307 지치고 삶이 힘든데... [1] 3ㅇㄴㅁ(211.235) 10.01 51 0
2893306 아.. 그리고 freebsd ports에서 patch 만드는 명령 있잖 나르시갤로그로 이동합니다. 10.01 45 0
2893305 표현의 자유 억압하는 디시인사이드 [6] 야옹아저씨갤로그로 이동합니다. 10.01 309 6
2893303 생기부 컴공 위주로 적어놨는데 인생 망한거임? ㅇㅇ(49.165) 10.01 64 0
2893301 아동음란물이 최고임 ㅇㅅㅇ [1] 류류(118.235) 10.01 76 1
2893295 점심 저녁 발명도둑잡기(211.246) 10.01 40 0
2893294 고양이 촛대 발명도둑잡기(110.70) 10.01 80 0
2893293 흠... 술좀 끊어볼랬더만 술이 또 땡기네... [2] ㅇㅇ(223.39) 10.01 56 0
2893292 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥덩냥이♥갤로그로 이동합니다. 10.01 69 1
2893291 캐데헌에 편승하는 아니메 발명도둑잡기(59.6) 10.01 48 0
2893290 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ [1] ♥덩냥이♥갤로그로 이동합니다. 10.01 72 0
2893289 또 이렇게 러스트가 얼마나 위대한 언어인지 깨닫게 된다. [1] 프갤러(218.154) 10.01 68 0
2893288 귀염감수성이 미래당⭐+ ♥냥덩이♥갤로그로 이동합니다. 10.01 58 0
2893287 그래도 이넘 복제하는 경우가 없진 않나보네 [1] 프갤러(218.154) 10.01 69 0
2893286 Anne-Marie - DEPRESSED 발명도둑잡기(118.216) 10.01 34 0
2893285 뀨❤+ ♥냥덩이♥갤로그로 이동합니다. 10.01 44 0
2893284 애널의달성 20/// ♥냥덩이♥갤로그로 이동합니다. 10.01 45 0
2893283 와 근데 테스트용 api 하나 robots.txt에 처리 안하니까 [1] ㅆㅇㅆ(113.192) 10.01 72 0
2893282 결론. 빠따들고 뒤통수 갈겨버려야겠다. [3] 프갤러(218.154) 10.01 81 0
2893281 코딩이라는게 오히려 사회성이 더 필요한게 아닌가 싶어 [4] ㅇㅇ갤로그로 이동합니다. 10.01 83 0
2893280 아스트랄(유희왕) 이새끼<<왤케 통곡의 벽이냐 ㅆㅇㅆ(113.192) 10.01 48 0
2893279 뉴프로 계정이 날아갔습니다 [6] 가연아갤로그로 이동합니다. 10.01 64 0
2893278 틱톡에서 금쪽이 검색해서 쇼츠보니깐 꿀잼 ㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 10.01 44 0
2893277 내일까지 외주 끝내야하는데 토나온다 그냥 씨발거 ㅆㅇㅆ(113.192) 10.01 42 0
2893276 중국인 불법가짜의사 체포 ♥냥덩이♥갤로그로 이동합니다. 10.01 41 0
2893275 이넘 개별 변수로 복제는 트리 쉐이킹이랑 별로 관계없다는데 [4] 프갤러(218.154) 10.01 61 0
2893274 씨발년이 [10] 개멍청한유라갤로그로 이동합니다. 10.01 84 0
2893273 프로그래밍에서 중요한것은 상위의 맥락이 하위의 패턴 정당성을 결정하는 ㅆㅇㅆ(113.192) 10.01 59 0
2893272 결국 단순 코드 쪼가리더라도 국소적 최적화와 전역적 최적화에 ㅆㅇㅆ(113.192) 10.01 60 0
2893271 보통 저런 기법 같은건 현대 아키텍트 기법 모르면 잘 모르긴합니다 [2] ㅆㅇㅆ(113.192) 10.01 64 0
2893270 저거 아래 enum 에서 export const 하는거 저게 [2] ㅆㅇㅆ(113.192) 10.01 72 0
2893269 바이브 코딩 보고 살인충동 느꼈는데 아무나 날 설득해줘 [6] 프갤러(218.154) 10.01 93 0
2893268 보통 자기가 못하면 쟤는 저걸 잘하는구나 하고 걍 넘기고 ㅆㅇㅆ(113.192) 10.01 59 0
2893267 이라크 사담후세인, 알카에다도 부시 친구였는데 한국도 그 꼴이 되어간다 발명도둑잡기(118.216) 10.01 36 0
2893266 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥냥덩이♥갤로그로 이동합니다. 10.01 38 0
2893265 FreeBSD Ports에서 GNAT(Ada) 분리 및 기본 구성 문의 나르시갤로그로 이동합니다. 10.01 37 0
2893264 특히 악질인점이 자꾸 없는 말을 만들어서 저격한단거임 ㅆㅇㅆ(113.192) 10.01 52 0
2893263 쟤가 안타까운게 보통 저렇게 기초를 모르면 부끄러움을 느낌 [2] ㅆㅇㅆ(113.192) 10.01 76 0
2893262 AI가 3,700년 된 바빌로니아 점토판을 해독했다 발명도둑잡기(118.216) 10.01 43 0
2893261 210.17 유동 인마 걍 관심 주지마라 루도그담당(211.184) 10.01 63 0
2893260 downstream life 새기들이 푸념 징징은 존나 많더라고 프갤러(49.165) 10.01 33 0
2893258 210.217 류도그는 왜 이래 열등감에 절어사냐 ㅆㅇㅆ찡갤로그로 이동합니다. 10.01 61 0
2893257 10점 만점에 몇점짜리 좆소냐? [3] ㅇㅇ(175.200) 10.01 75 0
뉴스 김동현, “아내 너무 예뻐...1년 동안 싸이월드에 댓글만 남겨“ 디시트렌드 10.08
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2