• 직렬 포트 활동 분석

    직렬 포트 모니터는 일부 응용 프로그램에서 이미 열려 있는 경우에도 COM 포트에 연결할 수 있으며 즉시 모니터링을 시작할 수 있습니다. 모니터링되는 COM 포트를 통과하는 모든 데이터는 모니터링 프로그램에 표시됩니다. 모든 것이 실시간으로 기록되기 때문에 문제를 즉시 발견할 수 있습니다. 데이터를 비교하기 위해 다른 보기에서 동일한 IRP를 동기화하여 선택하는 기능이 있습니다.

    또한 모든 모니터링 데이터를 지정된 파일로 리디렉션하거나 녹화된 모든 데이터를 클립보드에 복사할 수 있습니다. 직렬 포트 모니터는 모든 직렬 포트 입/출력 제어 코드(IOCTL)를 가로채고 기록하고 모든 데이터와 매개변수를 모니터링하는 기능을 제공합니다. 모니터링 세션을 저장하고 필요한 경우 다음에 로드할 수 있습니다.

  • 동일한 세션 내에서 여러 포트 모니터링

    직렬 포트 모니터에는 고유한 기능여러 COM 포트를 동시에 모니터링합니다. 이제 애플리케이션이 두 개 이상의 포트와 상호 작용하고 동일한 세션 내에서 여러 장치와 병렬로 상호 작용하는 방식에 대한 데이터를 수집할 수 있습니다. 수신 및 전송된 모니터링 데이터는 수신된 순서대로 별도의 로그에 표시(기록)되므로 분석이 크게 간소화됩니다.

  • 수신된 데이터를 보기 위한 다양한 옵션

    한 번에 4가지 모드(테이블, 행, 덤프 또는 터미널)로 모니터링 데이터를 볼 수 있으며, 각 모드는 기록된 직렬 데이터를 표시하는 다른 방법을 제공합니다. 직렬 포트 모니터를 사용하면 모니터링 필터를 선택할 수 있으므로 시간을 절약하고 관심 있는 이벤트만 모니터링할 수 있습니다. 설정에서 표시할 데이터를 선택할 수 있습니다. 바이너리, ASCII, 포트 구성. 모든 디스플레이 설정은 현재 모니터링 프로세스에서 직접 적용할 수 있습니다.

  • 직렬 장치로의 데이터 전송 에뮬레이션

    로 데이터를 보낼 수 있습니다. 다양한 형식(문자열, 바이너리, 8진수, 10진수, 16진수, 혼합) 직렬 포트 모니터 터미널 모드 기능을 사용하여 제어되는 응용 프로그램에서 직접 보낸 것처럼 모니터링되는 직렬 포트로 전송합니다. 이러한 방식으로 일부 특수 명령 및 데이터에 대한 제어된 직렬 장치의 응답을 모니터링할 수 있습니다.

  • Modbus 데이터 프로토콜(RTU 및 ASCII)에 대한 완전한 지원

    새로운 직렬 포트 모니터 필터의 도움으로 Modbus 데이터를 해독하고 분석할 수 있습니다. 이 프로그램은 RS485/422/232 장치 간의 연결을 설정하는 데 도움이 될 뿐만 아니라 전달되는 데이터에 대한 효과적인 분석을 수행합니다.

  • 모니터링 세션 재생 및 비교

    직렬 포트 모니터는 진행 중인 프로세스에 대한 최상의 분석을 위해 애플리케이션에서 포트로 세션을 재생할 수 있는 고유한 기회를 제공합니다. 동일한 데이터의 통과에 대한 직렬 포트의 반응을 관찰할 수 있으므로 모니터링 효율성이 향상됩니다. 또한 여러 모니터링 세션을 비교하고 그 차이를 자동으로 추적하는 옵션이 있습니다.

오늘 컴퓨터 바이러스말 그대로 전 세계에 넘쳐나고 인터넷을 자유롭게 돌아다니기 때문에 포트에 관해서는 대부분의 사용자가 TCP/IP 또는 UDP와 같은 네트워크 기술에서 통신 채널을 구성하는 데 사용되는 논리적 포트를 자주 생각하고 물리적 포트를 잊어버립니다. 외부 장치 연결용. 그러나 프린터를 연결하는 데에도 마우스와 키보드가 점점 더 많이 사용됩니다. 고속 USB 포트그리고 점점 덜 자주 - 좋은 오래된 COM 및 LPT(직렬 및 병렬 포트). 그러나 후자는 가장 현대적인 컴퓨터에서도 사용할 수 있으며 아마도 다른 목적(예: 하나 또는 다른 특수 장치 제어)으로 사용할 때가 되었습니다.

컴퓨터와 일부 장치 간의 교환을 추적하려면 포트 분석기 프로그램만 있으면 됩니다.

물론 아날로그 및 디지털 신호(USB, LPT 및 COM 분석기 포함)를 모니터링하기 위한 특수 장치(프로브)도 판매되고 있습니다. 전문 장비그들은 꽤 비쌉니다.

컴퓨터 직렬 포트 제어(COM)

직렬 포트 분석 프로그램 중 하나는 Valery Kovtun(http://valery-us4leh.narod.ru/)이 작성했습니다. 좋은 도구 감사합니다!

이 프로그램은 Com Port Visual Control(http://valery-us4leh.narod.ru/ComVC.html)이라고 하며 무료로 배포되며 시각적 제어, 데이터 교환 문서화 및 UART 송수신기에서 발생하는 프로세스 연구를 위한 것입니다. COM 포트를 사용하는 응용 프로그램 작동 중 개인용 컴퓨터. 이 프로그램은 윈도우 환경 9x/Me/NT/2000/XP 및 UART 칩의 모든 레지스터에 대한 연속 보기(모니터링)를 수행합니다. 컨트롤러는 8x8 형식(8비트의 8개 레지스터)을 가지며 각 레지스터에 대해 현재 상태(10진수 및 16진수 형식으로 동시에)와 논리 상태를 독립적으로 표시합니다. 또한 프로그램은 레지스터에 값을 쓰고(10진수 및 16진수 형식 모두) 그에 따라 논리 상태를 관리할 수 있습니다. 또한 레지스터의 변화를 감시하고 UART 칩의 송수신기의 명령에 따라 프로토콜(LOG)을 유지하며, 송수신 데이터의 프로토콜을 기계어 수준으로 유지한다. 작업 후 프로그램은 LOG 파일을 보고 저장하며 필요한 정보를 검색할 수 있습니다.

Com Port Visual Control에는 내장 트랜시버가 있습니다. 표준 설정포트 모드: 데이터 비트, 정지 비트, 속도, 패리티, 오류 제어, 텍스트 데이터 및 모뎀 명령을 수신 및 전송하는 기능, UART 명령의 활성 상태 모니터링을 위한 표시기(17개의 기본 명령 지원). 또한 컴퓨터 포트는 레지스터 그룹과 상태 비트를 동시에 표시하여 모니터링되며 기본 레지스터의 데이터를 변경하기 위한 프로토콜이 유지됩니다.

그러한 프로그램 중에는 무료 유틸리티 Realtime Communications(RTCOMM, http://www.rtcomm.com/)의 ComLite32, Windows 95 및 프리미엄 유료 버전인 ComLab32(http://www.rtcard.com/comlab32.html)용으로 작성되었습니다.

이러한 프로그램은 문서가 없는 경우에도 COM 포트를 통해 교환을 탐색하고 특정 장치가 작동하는 방식을 이해할 수 있는 강력한 실시간 통신 분석기입니다. 이 프로그램은 편리하고 직관적인 명확한 인터페이스, 교환 모니터링, I/O 포트 관리 및 자세한 온라인 문서 제공을 용이하게 합니다.

ComLite32 및 ComLab32 프로그램은 RS-232, RS-422, RS-485 및 RTX485 포트(마지막 포트는 읽기 전용임)와 함께 작동하며 이러한 포트와 양방향으로 통신할 수 있습니다. 시스템 요구 사항 ComLite32 프로그램은 최소 8MB RAM, 6MB 디스크 공간및 직렬 포트와 작동하는 하나 이상의 장치(노트북 PCMCIA 모뎀 포함).

마지막으로 AGG Software(http://www.aggsoft.ru)의 Advanced Serial Port Monitor 및 Advanced Serial Data Logger 프로그램에 주목하고 싶습니다. Advanced Serial Data Logger는 RS-232를 통해 수신된 데이터를 처리하여 엑셀 파일, Access 또는 기타 Windows 응용 프로그램. 이 프로그램은 모든 장치에서 실시간으로 데이터를 수집하는 기능을 제공할 뿐만 아니라 RS-232 인터페이스를 통해 또는 하드웨어 변환기를 사용할 수 있는 경우 RS-485 인터페이스를 통해 데이터를 수신 및 전송할 수 있습니다. 고급 직렬 데이터 로거는 직렬 포트에서 데이터를 수집하고, 사용자의 필요에 따라 처리하고, 일반 스트림에서 데이터 블록을 추출한 다음 응용 프로그램에서 적절한 키를 눌러 데이터를 Windows 또는 DOS 응용 프로그램으로 전송합니다. 창문. 데이터는 DDE(Dynamic Data Exchange), ODBC, OLE 등을 통해 전송됩니다. 이 솔루션은 자동화된 데이터 수집 시스템 또는 PBX 호출 분석 시스템에서 사용할 수 있습니다.

Advanced Serial Data Logger는 또한 ASCII(기본값) 또는 MODBUS 프로토콜을 통해 장치를 직접 제어하기 위해 직렬 포트를 통해 요청과 명령을 보낼 수 있습니다. 따라서 Advanced Serial Data Logger 프로그램은 I/O 서버가 됩니다. 관리 및 설정은 매우 간단하고 직관적입니다. 데이터 수집을 위한 추가 프로그래밍은 필요하지 않습니다.

또한 고급 직렬 데이터 로거는 Windows NT/2000/XP/2003에서 서비스로 작동할 수 있습니다. 이 서비스는 시스템 부팅 시 시작되어 사용자가 로그하기 전에도 직렬 포트의 데이터를 디스크의 파일 또는 기타 지정된 위치에 씁니다. 시스템에 입력합니다(사용자 세션이 끝난 후에도 계속 작동함).

이 프로그램은 동일한 컴퓨터에서 여러 복사본을 실행할 수 있으므로 여러 포트를 동시에 기록할 수 있습니다.

고급 직렬 포트 모니터 프로그램은 초보자와 전문가 모두에게 유용할 수 있습니다.

고급 직렬 포트 모니터를 사용하여 다른 응용 프로그램의 데이터 전송을 모니터링하고 컴퓨터의 직렬 포트(RS-232)를 통해 데이터를 보내고 받을 수 있습니다. 프로그램 제공 다양한 방법데이터를 파일로 저장하거나 모니터 화면에 시각화합니다.

따라서 적절한 변환기를 사용하여 RS-232 또는 RS-485(RS-422) 인터페이스를 통해 작동하는 모든 장치로 작업할 수 있습니다. Windows 응용 프로그램과 Windows 응용 프로그램 간의 데이터 교환을 관찰합니다. 외부 장치직렬 포트에 연결됩니다. 이것은 측정 장치, 가정용 라디오 방송국 또는 z-모뎀 또는 널 모뎀 케이블을 통해 연결된 다른 컴퓨터일 수 있습니다.

고급 직렬 포트 모니터는 전이중 작동을 지원합니다. 즉, 다른 프로그램을 사용하지 않고 다른 응용 프로그램을 중단하지 않고 양방향으로 교환을 모니터링할 수 있습니다. 직렬 포트를 통과하는 모든 정보는 화면에 특수 창으로 표시되며 파일에 쓸 수 있습니다. 표시된 모든 매개변수는 작동 중에 변경할 수 있습니다. 동시에 프로그램은 자동 및 수동의 두 가지 모드를 지원합니다. 즉, "보내기" 버튼을 눌러 데이터를 보내거나 특정 간격(10~10,000ms)으로 자동으로 전송됩니다.

추가 모듈의 도움으로 데이터를 수신하거나 명령을 보낼 수 있을 뿐만 아니라 일부 작업을 에뮬레이션할 수도 있습니다. 특정 장치, 그리고 관찰자(인터셉터) 모드에서 - 직렬 포트에 연결된 외부 장치와 일부 장치 간의 데이터 교환을 모니터링하기만 하면 됩니다. 윈도우 애플리케이션. 마지막으로 Advanced Serial Port Monitor에는 자체 스크립팅 언어가 내장되어 있어 미리 설정된 옵션과 동작으로 프로그램을 실행하고 모듈에서 명령을 실행할 수 있습니다.

컴퓨터 병렬 포트 제어(LPT)

Valery Kovtun에는 또 다른 유용한 통신 프로그램인 LPT 3D Hard Analyzer가 있습니다. 이 프로그램은 Windows 95/98/Me/NT/2000/XP에서 컴퓨터의 병렬 포트에 연결된 장치의 디지털 신호 및 프로토콜을 캡처하도록 설계된 그래픽 스토리지 분석기-오실로스코프입니다.

LPT 3D Hard Analyzer는 LPT 포트를 통해 작동하며 SPP 모드에서 5개의 입력 라인(채널)과 12개의 출력 채널(즉, 컴퓨터의 디지털 신호 제어)을 분석하거나 4개의 출력 라인과 14개의 출력 라인을 조작할 수 있습니다. 입력 매개변수 EPP 모드에서 양방향 EPP 병렬 포트 모드는 1993년 이후 출시된 거의 모든 컴퓨터에서 사용할 수 있습니다. 그러나 BIOS에서 기본적으로 활성화되어 있지 않은 경우도 있습니다(이를 확인하고 가능한 경우 활성화해야 함).

오실로스코프 모드에서 작업할 때 프로그램은 17개의 그래프(선)를 모두 기억하고 깊이(시간에 따라 그래프의 표시 길이)는 컴퓨터의 여유 메모리(OC Windows의 페이징 파일 고려)에 의해서만 제한됩니다. 이것은 수백 메가 바이트가 될 것입니다). 각 항목을 자동으로 저장하는 옵션도 있습니다. 새 페이지그래픽 형식으로.

분석기-오실로스코프 LPT 3D 하드 분석기는 2차원 및 3차원 형식으로 데이터 변경 사항을 표시하고 17채널 오실로스코프(채널당 비트 수)와 포트 레지스터 그래프(입력, 출력, 제어)의 두 가지 독립적인 다이어그램도 표시합니다. . 분석 속도의 조정이 있으며 그래프의 전체 진행 기간 동안의 총 사이클 수가 표시됩니다. 그래프를 메모리에 복사하는 기능으로 주기 수를 프로그래밍할 수도 있습니다(플로팅 깊이는 사용 가능한 컴퓨터). 이 프로그램에는 LPT 포트에 연결된 고속 장치에서 데이터를 읽고 이 프로그램에 의해 동기화되는 동안 시스템 리소스를 절약하는 도구가 있습니다(즉, 상대적으로 약한 컴퓨터에서 사용할 수 있음). 그래픽 표시 모드를 끄면 그래픽이 컴퓨터의 메모리에만 복사되므로 프로그램 속도가 10배 빨라집니다. 분석이 끝나면 그래프를 그래픽 표시 모드로 전환한 것과 같은 방식으로 그래프를 볼 수 있습니다. 그래프 스크롤은 페이지 단위로 원활하게 수행됩니다( 마우스 오른쪽 버튼으로 클릭쥐). 속도와 스크롤 단계를 유연하게 설정할 수 있을 뿐만 아니라 전체 차트를 한 페이지 내에서 자동으로 압축하는 기능이 있습니다. 선택한 그래프 페이지의 상태에 대한 스냅샷은 다음 위치에 저장할 수 있습니다. BMP 형식및 WMF(Windows 메타파일) 또는 각 새 페이지에 대해 별도의 파일로 자동 저장을 설정합니다. 패키지를 보려면 브라우저 그래픽 파일이 내장되어 있습니다.

포트 제어 모듈은 LPT WDMIO I/O 드라이버를 사용하는 Valery Kovtun - XP LPT의 다른 프로그램의 핵심 코드를 기반으로 합니다.

XP LPT 프로그램은 Windows 9x/2000/XP에서 컴퓨터의 병렬 포트를 제어하도록 설계되었으며 다음과 같은 기능이 있습니다.

  • 시스템 관리자로 Windows XP에서 드라이버의 자동 등록을 수행합니다.
  • 리드 자동 체크설립된 항구;
  • 선택된 LPT 포트의 데이터, 제어 및 상태 레지스터의 동시 읽기를 수행합니다.
  • 레지스터의 내용을 다른 형식(10진수 및 16진수)으로 동시에 표시하므로 다시 계산할 필요가 없습니다.

이 프로그램은 원천, 설명 및 이 솔루션을 기반으로 병렬 포트를 통해 외부 장치를 제어하는 ​​프로그램을 만드는 예제를 제공합니다.

이미 언급했듯이 프로그램은 LPT WDMIO I/O 드라이버를 통해 작동하며 Windows 환경에서 병렬 포트를 통해 외부 장치를 제어하기 위해 자체 제작한 프로그램을 교육 및 디버깅하도록 특별히 설계되었습니다.

Valery Kovtun은 또한 컴퓨터의 LPT 포트를 사용하는 장치용 17비트 데이터 교환 프로토콜 분석기로 병렬 포트를 제어하는 ​​데 사용되는 PortControl 프로그램을 만들었습니다. 이 프로그램은 Windows OS 제품군용으로 작성되었으며 다음과 같은 기능이 있습니다.

  • 포트 주소(레지스터)를 입력하고, 자동으로 포트에서 데이터를 읽고, 10진수 및 16진수 형식으로 포트에 데이터를 쓰고, 바이트, 워드 및 Dword 형식으로 데이터를 표시하는 데 사용할 수 있는 3개의 독립 채널이 있습니다.
  • LPT 포트의 17비트 각각의 상태가 표시되고 출력 비트가 제어됩니다.
  • 9개의 프로그래밍 가능한 포트/데이터 메모리 뱅크 사용 가능;
  • 각 비트의 논리 상태에 대한 17채널 분석기 오실로스코프는 분석 속도(시간 내), 17비트(높음(1) 및 낮음(0) 모두)에 의한 동기화를 설정하는 기능과 함께 작동합니다. 비트당 전송된 데이터 카운터 및 손쉬운 확인 및 설정을 위한 기타 여러 기능 디지털 기기컴퓨터에 연결되었습니다.

이 프로그램은 디지털 다채널 오실로스코프로 사용하거나 컴퓨터를 통해 외부 장치를 제어하는 ​​데 사용할 수 있습니다.

항구 분석 및 관리 프로그램은 다양한 응용. 첫째, 그들은 사용할 수 있습니다 자세한 확인및 예를 들어 테스트 아웃 모드를 사용하여 전체 시스템 및 LPT 포트의 성능을 확인하기 위해 컴퓨터의 병렬 포트의 성능을 테스트하는 단계를 포함합니다. 또한 특정 유형의 측정에 대해 유연하게 조정할 수 있는 내장 17채널 분석기-오실로스코프를 사용하여 모든 작업을 적시에 관찰하는 것이 편리합니다.

다양한 무선 전자 장치 및 마이크로 회로의 컴퓨터에 연결된 고속 디지털 데이터 전송 버스를 분석하려면 프로세서 주파수가 300MHz 이상인 컴퓨터가 권장됩니다. 그러나 저속 장치의 경우 약한 컴퓨터아래에 윈도우 컨트롤 95.

둘째, 분석기 프로그램을 사용하여 디지털 무선 전자 회로를 제어, 분석, 구성, 개발, 테스트 및 수리할 수 있습니다( 개별 모듈, 블록, 제어 버스, 주파수 합성기 제어 프로토콜, 제어 요소 디지털 표시기, ROM 프로그래머 등), 즉 널리 사용되는 곳 디지털 마이크로 회로, 제어 신호를 형성하고 어떻게든 반응합니다.

셋째, 포트 분석기 프로그램을 사용하여 교환 프로토콜을 읽을 수 있습니다. 또한 데이터 버스와 정보 저장 및 식별 장치의 제어 신호를 동기화하여 서비스 신호를 읽거나 0과 1의 순서로 인코딩된 비밀번호에 액세스할 수도 있습니다. 일반적으로 이러한 프로그램은 라디오 아마추어, 전자 엔지니어 또는 설계 엔지니어에게 권한을 부여하도록 설계되었습니다. 무선 전자 장치의 작동 프로토콜에 대한 시각적 연구는 자체 개발 시에도 유용할 수 있습니다. 소프트웨어다른 컨트롤러에 의해 제어됩니다.

넷째, 분석기 프로그램은 다양한 프린터, 스캐너, 금전 등록기 및 기타 장치와 같이 컴퓨터의 병렬 포트를 어떻게든 사용하는 사무 장비를 수리하는 데 매우 유용합니다.

다섯째, 나열된 프로그램은 초보 프로그래머에게 유용합니다. 예를 들어 쓰기로 결정한 경우 작은 프로그램병렬 포트를 통해 특정 외부 장치를 제어하려면 PortControl 다기능 인터페이스에서 프로그램의 알고리즘을 시각적으로 관찰하는 것이 매우 편리합니다. 결과적으로 사용하지 않고도 제 시간에 실수를 감지하고 제거할 수 있습니다. 측정기포트의 출력에서 ​​제어되는 장치의 회로를 방해하지 않습니다.

마지막으로 병렬 포트의 경우 Valery Kovtun은 다음을 제안합니다. 유용한 프로그램 LPT 포트 비트의 논리적 상태를 모니터링하고 등록하도록 설계된 PinRegistrator. 이 프로그램은 Windows 95/98/Me에서 작성되었으며 병렬 포트의 상태를 자동 또는 수동으로 기록합니다.

컴퓨터 USB 포트 제어

앞서 언급한 회사 AGG Software에는 USB 포트, 버스, 컨트롤러 및 장치를 분석하고 모니터링하도록 설계된 프로그램이 있습니다. 예를 들어 고급 USB 모니터(http://www.aggsoft.ru/usb-monitor/index.htm)를 사용하면 USB 장치의 효율적인 디버깅 및 테스트를 위해 USB 트래픽을 캡처, 분석, 보기 및 처리할 수 있습니다. 모든 사양을 충족하는 장치가 지원됩니다. UHCI-(구 USB 장치최대 1.5Mbps의 속도로 작동하는 1.x 장치), OHCI-(최대 12Mbps의 속도로 작동하는 차세대 USB 1.x 장치) 및 마지막으로 USB 2.0 EHCI 장치(최대 480Mbps의 속도로 작동). 고급 USB 모니터를 사용하면 USB 장치 개발자와 고급 사용자 모두를 위한 실험실 도구 키트를 확장할 수 있습니다.

고급 USB 모니터는 전송된 데이터 패킷을 읽을 수 있는 방식으로 표시하고, 설명자를 디코딩하고, 패킷 오류를 감지하고, 장치 성능을 측정할 수 있습니다. 캡처하는 동안 데이터 패킷을 실시간으로 표시하여 장치의 상태를 모니터링할 수 있습니다. 데이터 패킷은 시간순으로 저장되며 다음을 포함합니다. 전체 정보주소와 끝점에 대해. 이를 통해 패킷을 식별, 필터링 및 검색하기가 매우 쉽습니다. 프로그램은 데이터를 표시할 때 여러 수준의 세부 정보를 제공합니다. USB 트래픽의 빠른 디코딩으로 이러한 상황에서도 작업이 가능합니다. 고속 장치 USB 드라이브 또는 USB 카메라와 같은 또한 캡처된 데이터의 캡처, 모니터링 및 기록이 실시간으로 발생합니다. 고급 USB 모니터를 사용하면 동시에 여러 모니터링 창을 열어 다양한 USB 장치에 대해 발생하는 트래픽을 동시에 볼 수 있습니다.

WDM, WMI, 전원 관리 및 PNP를 지원하는 캡처 커널 드라이버를 사용하면 운영 체제최대 성능을 위한 USB 장치.

이 프로그램은 또한 모든 USB 장치의 성능을 측정할 수 있는 기능을 제공합니다. Advanced USB Monitor는 USB 장치의 토폴로지를 쉽게 탐색하고 자세한 정보를 얻습니다. 기술적 인 정보 USB 드라이브(인터페이스, 끝점, 레지스트리 정보, 클래스 정보 등). 스터디가 끝나면 연결된 기기 및 USB 트래픽에 대한 기성 보고서를 얻을 수 있으며 스터디가 끝나면 프린터로 인쇄할 수 있습니다. 또한 프로그램에는 데이터를 다음으로 내보내기 위한 고급 기능이 있습니다. PDF 형식, XML 또는 마이크로 소프트 워드, 데이터 후처리 프로세스를 이 하나의 프로그램으로만 제한하지 않도록 합니다.

USB 오실로스코프(http://www.usb-osc.narod.ru/)는 위에서 설명한 병렬 포트용 분석기-오실로스코프와 동일한 원리로 작동합니다. USB 오실로스코프는 주로 작업의 특성상 저주파 분석의 필요성에 직면한 아마추어 라디오를 대상으로 합니다. 아날로그 신호, 천천히 변화하는 장기 프로세스를 등록하고, 다양한 장치. 또한 USB 오실로스코프는 +/-20V 범위의 전압에 대한 간단한 2채널 전압계, 최대 50kHz의 신호 주파수에 대한 주파수 카운터 또는 가청 경고가 있는 프로브로 사용할 수 있습니다.

따라서 USB 오실로스코프는 다음과 같은 작동 모드를 제공합니다.

  • 2채널 오실로스코프(마커 측정, 동기화, 신호 전압 및 주파수 측정, 필터링 등);
  • 2채널 스펙트럼 분석기(마커 측정, 다양한 창 기능, 필터링 등);
  • 2채널 레코더(마커 측정, 수십 시간 동안의 신호 녹음 등);
  • 8/16채널 로직 분석기(마커 측정, 동기화, 주어진 수의 펄스 건너뛰기, 주어진 논리적 조합 검색, 디코딩 인터페이스 UART, SPI, I2C, 1-Wire 등);
  • 8채널 로직 제너레이터(신호 테이블 설정 또는 마우스로 타이밍 다이어그램 직접 구성 등).

또한 USB 오실로스코프를 사용하면 나중에 다른 프로그램으로 가져오거나 나중에 분석하기 위해 파일에 저장할 수 있도록 모든 측정 결과를 벡터 또는 래스터 도면의 형태로 저장할 수 있습니다. 모든 측정 결과를 인쇄하고 클립보드에 복사할 수 있으며 이벤트를 설정하고 사운드 해설과 함께 제공할 수 있습니다. 다양하게 셀 수 있다 디지털 필터아날로그 신호의 필터링과 오실로스코프 타이밍 다이어그램의 평활화를 수행합니다. 이 장치를 사용하면 로직 분석기 및 생성기의 모든 채널에 대한 통계를 표시할 수 있습니다.

그러나 USB 오실로스코프는 더 이상 단순한 프로그램이 아니라 USB 인터페이스가 있는 외부 장치 형태로 만들어지고 서비스 제공자가 동반하는 장치입니다. 소프트웨어 모듈. 즉, 스위칭 부착 장치와 컴퓨터로 구성된 전체 범용 측정 단지입니다. 그건 그렇고, USB 버스를 통해 이러한 장치의 펌웨어를 업데이트할 수 있으므로 사용자 지정 기능으로 장치의 기능을 보완할 수 있습니다.

이러한 장치는 우크라이나 회사 Da-Labs(http://www.da-labs.com/) 및 러시아 회사"Trade-M"(http://motor-master.ru/index.htm/). 러시아 회사 세트의 가격은 1850 루블입니다. 배달 제외.

따라서 필요한 도구로 무장하여 이제 컴퓨터의 모든 포트를 사용하여 다양한 외부 장치에 대한 제어 프로그램을 독립적으로 작성할 수 있습니다.

직렬 포트는 유지 관리 및 사용의 용이성으로 인해 개발자들에게 사랑받고 있습니다.

물론 터미널 프로그램의 콘솔에 쓰는 것은 모두 좋지만 화면의 키를 눌러 필요한 작업을 수행하는 자체 응용 프로그램을 원합니다.)

이 기사에서 나는 설명 할 것입니다 C++ 언어에서 com 포트로 작업하는 방법.

솔루션은 간단하지만 어떤 이유로 작동 예제를 즉시 찾지 못했습니다. Sim의 경우 여기에 저장합니다.

물론 QSerial과 같은 플랫폼 간 솔루션을 사용할 수 있습니다. Qt에 포함된 라이브러리입니다. 아마 그럴 것입니다. 이제 우리는 "순수한" Windows에 대해 이야기하고 있습니다. C++. 우리는 쓸 것입니다 비주얼 스튜디오. 나는 2010을 가지고 있지만 이것은 어떤 역할도하지 않습니다 ...

새 콘솔 Win32 프로젝트를 만듭니다.

헤더 파일 포함:

#포함 #포함 네임스페이스 std 사용

우리는 com 포트 핸들러를 선언합니다:

HANDLE h시리얼;

전역적으로 수행하므로 함수에 전달할 때 포인터에 대해 걱정할 필요가 없습니다.

int _tmain(int argc, _TCHAR* argv) (

나는 Windows 스타일의 프로그래밍을 참을 수 없습니다. 그들은 모든 것을 자신의 방식으로 부르고 기뻐하며 앉아 있습니다 ...

이제 포트 이름으로 문자열을 선언하는 마술입니다. 문제는 char 자체를 변환할 수 없다는 것입니다.

LPCTSTR sPortName = L"COM1";

Windows에서 직렬 포트 작업은 파일 작업과 유사합니다. 첫 개봉 쓰기/읽기용 com 포트:

HSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

기능 확인:

If(hSerial==INVALID_HANDLE_VALUE) ( if(GetLastError()==ERROR_FILE_NOT_FOUND) ( cout<< "serial port does not exist.\n"; } cout << "some other error occurred.\n"; }

이제 연결 매개변수를 구성해야 합니다.

DCB dcbSerialParams = (0); dcbSerialParams.DCBlength=sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) ( cout<< "getting state error\n"; } dcbSerialParams.BaudRate=CBR_9600; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if(!SetCommState(hSerial, &dcbSerialParams)) { cout << "error setting serial port state\n"; }

msdn에서는 먼저 매개변수를 가져온 다음 변경하는 것이 좋습니다. 우리는 여전히 배우고 있으므로 요청한 대로 수행합니다.

이제 전달할 문자열과 이에 필요한 변수를 선언해 보겠습니다.

Char data = "Hello from C++"; // DWORD를 전달할 문자열 dwSize = sizeof(data); // 이 문자열의 크기 DWORD dwBytesWritten; // 실제로 전송된 바이트 수입니다.

문자열을 보냅니다. 예제가 가장 간단하므로 특별한 검사는 하지 않습니다.

BOOL iRet = WriteFile(hSerial,data,dwSize,&dwBytesWritten,NULL);

또한 제어에 전송된 문자열 크기와 바이트 수를 표시하기로 결정했습니다.

커트<< dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;

프로그램이 끝나면 데이터 읽기의 무한 루프를 만듭니다.

동안(1) ( ReadCOM(); ) 반환 0; )

이제 읽기 기능:

Void ReadCOM() ( DWORD iSize; char sReceivedChar; while (true) ( ​​​​ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0); // (iSize > 0) 경우 1바이트를 얻음 // 무언가가 수신되면 출력 출력<< sReceivedChar; } }

그것이 실제로 전체 예입니다.

Arduin이 Serial로 보낸 데이터를 아름답게 표현하는 방법에 대해. 제 생각에 사람들은 한편으로는 매우 간단해 보이고 다른 한편으로는 최소한의 노력으로 훌륭한 결과를 얻을 수 있는 매우 아름다운 솔루션을 제공했습니다.

기사 댓글에는 파이어폭스에서는 그런 솔루션이 작동하지 않는다는 점을 유감스럽게 생각하며 "이걸 기반으로 html 출력으로 간단한 웹 서버를 계속 작성할 수 있다"는 아이디어가 나왔다. 이 아이디어는 저를 "매료"시켰습니다. Google의 빠른 검색은 기성품 솔루션을 제공하지 않았으며 아이디어를 직접 구현하기로 결정했습니다. 그리고 여기에서 나온 것이 있습니다.

경고! 제안된 솔루션이 완전한 것으로 간주되어서는 안 됩니다. Amperka의 직렬 프로젝터와 달리 이것은 가능한 접근 방식의 시연이자 작동하는 프로토타입일 뿐 그 이상도 아닙니다.

얼마 전에 Android 스마트폰에 내장된 가속도계를 사용하여 Arduino에 연결된 서보를 제어하는 ​​프로젝트를 수행했습니다. 그런 다음 이러한 목적을 위해 Android(SL4A) 및 RemoteSensors 프로젝트용 스크립팅 레이어를 사용했습니다. python 표준 라이브러리에는 BaseHTTPServer 패키지가 포함되어 있는 것으로 나타났습니다. 이 패키지를 사용하여 python에서 웹 서비스를 생성하는 것은 몇 줄의 코드로 수행되는 작업입니다.

수중에 아두이노용 센서가 없어서 아두이노 우노에 내장된 내부 온도계를 정보 소스로 사용했습니다. 내가 이해하는 한, 이것은 매우 정확하지 않고 주변 온도를 측정하기 위한 것이 아니지만 프로토타이핑에는 사용할 수 있습니다.

짧은 인터넷 검색 후 arduino에 대한 스케치는 다음과 같습니다.

// 소스: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() ( long result; // 1.1V 기준에 대해 온도 센서 읽기 ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); delay(2); // Vref가 ADCSRA를 안정화할 때까지 기다림 |= _BV(ADSC); // 변환하는 동안 (bit_is_set(ADCSRA,ADSC)); result = ADCL; result |= ADCH<<8; result = (result - 125) * 1075; return result; } void setup() { Serial.begin(115200); } int count = 0; void loop() { String s = String(count++, DEC) + ": " + String(readTemp(), DEC); Serial.println(s) delay(1000); }
이 스케치는 COM 포트를 열고 115200 보드로 설정한 다음 내장된 온도계의 현재 값을 1초마다 씁니다. (온도가 어떤 단위로 주어지는지 묻지 마십시오. 설명 된 작업의 경우 중요하지 않습니다). 값이 크게 변경되지 않기 때문에 데이터 변경 사항을 더 잘 볼 수 있도록 온도 앞에 줄 번호가 표시됩니다.

웹 서버가 COM 포트에서 읽을 때 일부가 아닌 전체 라인만 제공하는지 확인하려면
Serial.println(들)
로 대체되었습니다
for(int i=0; 나는< s.length(); i++){ Serial.print(s.charAt(i)); delay(200); } Serial.println("");
저것들. 형성된 문자열은 전체가 직렬 포트로 출력되지 않고 200ms의 일시 중지와 함께 문자별로 출력됩니다.

우선 웹 서버의 매우 간단한 프로토타입이 작성되었습니다(아래에서 부분적으로 분해됨).
# -*- 코딩: utf-8 -*- #-- 기반: https://raw.githubusercontent.com/Jonty/RemoteSensors/master/remoteSensors.py SERIAL_PORT_NAME = "COM6" SERIAL_PORT_SPEED = 115200 WEB_SERVER_PORT = 8000 가져오기 시간 , BaseHTTPServer, urlparse import serial ser = None def main(): global ser httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler) #-- 가져오기 소켓을 제공하는 IP 주소를 얻기 위한 해결 방법 s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() print ""%s:%s"에서 검색" % (sData, WEB_SERVER_PORT) 서버 = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever() class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # DNS 조회 로깅 비활성화 def address_string(self): return str(self.client_address) def do_GET(self): self.send_response(200) self.send_header("Content-type", "application/x-javascript; charset=utf-8") self.end_headers() try: 동안 True: new_serial_line = new_serial_line이 None이 아닌 경우 get_full_line_from_serial(): self.wfile.write(new_serial_line) self.wfile.write("\n") socket.error를 제외하고 self.wfile.flush(), e: "클라이언트 연결이 끊겼습니다.\n" capture = "" def get_full_line_from_serial(): """은 직렬 또는 없음 전역 변수 "ser" 및 "captured"를 사용합니다. capture.split("\n", 1); if len(parts) == 2: capture = 부분 반환 부분 반환 if __name__ == "__main__": main()
스크립트를 조각별로 분해해 보겠습니다.

이것은 프로토타입이기 때문에 모든 주요 작업 매개변수(COM 포트의 이름, 속도 및 웹 서버가 실행될 TCP 포트 번호)가 소스 텍스트에 직접 표시됩니다.
SERIAL_PORT_NAME="COM6" SERIAL_PORT_SPEED=115200 WEB_SERVER_PORT=8000
물론 명령줄에서 이러한 매개변수를 읽도록 정렬할 수 있습니다. 예를 들어, argparse 모듈의 도움으로 이것은 매우 빠르고 간단하며 유연하게 수행됩니다.

이 경우 Windows 사용자는 장치 관리자에서 Arduin이 연결된 COM 포트의 이름을 찾아야 합니다. 나에게 그것은 "COM6"이었다. 다른 운영 체제의 사용자는 해당 OS의 도구를 사용해야 합니다. 나는 MacOS에 대한 경험이 전혀 없고 Linux에서도 COM 포트로 작업하지 않았지만, 아마도 "/dev/ttySn"과 같은 것이 될 것입니다.

다음은 파이썬에서 COM 포트 작업을 담당하는 Serial 클래스의 인스턴스가 바인딩될 전역 변수의 정의입니다.
ser = 없음
인라인
httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), 핸들러)
지정된 포트 WEB_SERVER_PORT에서 요청을 수신하는 웹 서버가 생성됩니다. 그리고 이러한 요청은 아래에 설명된 Handler 클래스의 인스턴스에 의해 처리됩니다.

다음 줄은 실행 중인 웹 서버가 실제로 실행 중인 IP 주소를 표시하는 약간의 "해킹"입니다.
#-- 가져오기 소켓을 제공하는 IP 주소를 얻기 위한 해결 방법 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() 인쇄 ""%s:%s"에서 검색" % (sData, WEB_SERVER_PORT)
내가 이해하는 한 이 IP를 찾을 수 있는 다른 방법은 없습니다. 그리고 이 지식이 없으면 브라우저에서 어떻게 서버에 액세스할 수 있습니까?

따라서 이 소켓의 속성에서 자신의 IP 주소에 대한 정보를 추출하려면 소켓을 열고 Google 사이트에 연결해야 합니다.

조금 더 낮으면 COM 포트가 열리고 웹 서버가 실제로 시작됩니다.
ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, 시간 초과=0) httpd.serve_forever()
다음은 실행 중인 웹 서버에서 수신한 요청을 처리하는 클래스에 대한 설명입니다.
클래스 핸들러(BaseHTTPServer.BaseHTTPRequestHandler):
이것은 BaseHTTPServer 모듈에 내장된 클래스의 상속자이며 do_GET 메서드만 재정의하는 것으로 충분합니다.

이것은 여전히 ​​프로토타입이기 때문에 서버는 모든 요청에 ​​"만족"할 것입니다. 어떤 URL이 요청되든 상관없이 클라이언트에 COM 포트에서 읽은 모든 데이터를 제공합니다. 따라서 Handler.do_GET에서 성공 코드와 필요한 헤더로 즉시 응답합니다.
self.send_response(200) self.send_header("콘텐츠 유형", "응용 프로그램/x-javascript; charset=utf-8") self.end_headers()
그 후 무한 루프가 시작되어 COM 포트에서 전체 줄을 읽으려고 시도하고 이 시도가 성공하면 웹 클라이언트로 전송합니다.
while True: new_serial_line = get_full_line_from_serial() new_serial_line이 아닌 경우 None: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush()
기본으로 사용된 프로젝트에서 이 무한 루프는 연결 중단을 신중하게 처리해야 하는 도움으로 try ...except 블록으로 "래핑"되었습니다. 아마도 Android(기본 프로젝트가 이를 위해 개발됨)에서는 이것이 잘 작동하지만 Windows XP에서는 작동하지 않았습니다. 연결이 끊어졌을 때 가로채는 방법을 결코 배우지 못한 다른 예외가 발생했습니다. 그러나 다행스럽게도 웹 서버가 정상적으로 작동하고 다음 요청을 수락하는 데 방해가 되지는 않았습니다.

COM 포트에서 전체 문자열을 가져오는 기능은 직렬 프로젝터 작성자와 동일한 원리로 작동합니다.

  • COM 포트에서 읽은 모든 것을 저장하는 전역 버퍼가 있습니다.
  • 함수가 호출될 때마다 COM 포트에서 무언가를 읽으려고 시도합니다.
  • 그녀가 성공하면
    • 방금 읽은 것을 지정된 전역 버퍼에 추가합니다.
    • 줄 끝 문자로 전역 버퍼를 최대 두 부분으로 나누려고 시도합니다.
    • 성공하면 첫 번째 부분을 호출 프로시저에 반환하고 두 번째 부분을 전역 버퍼의 새 값으로 사용합니다.
  • COM 포트에 새 데이터가 없거나 줄 끝 문자를 찾을 수 없는 경우 함수는 없음을 반환합니다.
capture = "" def get_full_line_from_serial(): """은 직렬 또는 없음 전역 변수 "ser" 및 "captured"를 사용합니다. capture.split("\n", 1); if len(parts) == 2: capture = 부품 반환 부품 반환 없음
그 결과 다음과 같이 밝혀졌습니다.

COM 포트에서 읽은 줄이 브라우저에 나타나는 것을 볼 수 있습니다. 웹 프론트엔드에 대해 아무것도 이해하지 못합니다. JavaScript, Ajax, CSS 및 DOM은 저에게 어두운 숲입니다. 그러나 웹 인터페이스를 만드는 프로그래머의 경우 이 출력을 Amperka의 직렬 프로젝터가 생성하는 것과 동일한 아름다운 그림으로 변환하기에 충분해야 한다고 생각합니다. 제 생각에 작업은 웹 서버에 액세스하여 스트림을 읽고 읽은 마지막 줄을 웹 페이지의 올바른 위치에 출력하는 자바 스크립트 스크립트를 만드는 것입니다.

만일의 경우를 대비하여 안전하게 플레이하기로 결정하고 스스로 첫 번째 근사치를 만들어 보았습니다. 그다지 심층적이지 않은 Google 검색에서는 실제로 이러한 목적을 위해 최소한 WebSocket 또는 Server-Sent Events가 사용되었다고 제안했습니다. 저는 Server-Sent Events를 잘 사용하는 것으로 보이는 것을 발견하고 이 기술을 사용하기로 결정했습니다.

메모! 이 기술은 Internet Explorer 8이나 Android 2.3.5에 내장된 브라우저에서 작동하지 않았기 때문에 이것이 최선의 솔루션이 아닌 것 같습니다. 그러나 적어도 Firefox 39.0에서는 작동했으므로 더 이상 "파기"하지 않았습니다.

python 스크립트의 관점에서 Server-Sent Events 아래의 변경 사항은 완전히 미미합니다.

  • 클라이언트에 제공된 데이터 유형을 교체해야 합니다.

    self.send_header("콘텐츠 유형", "응용 프로그램/x-javascript; charset=utf-8")
    ~로 교체되다
    self.send_header("콘텐츠 유형", "텍스트/이벤트 스트림")
  • 또한 COM 포트에서 읽은 줄 앞에 "data:" 접두사를 삽입하고 개행 문자를 하나 더 추가합니다.
    윤곽
    self.wfile.write(new_serial_line) self.wfile.write("\n")
    ~로 교체되다
    self.wfile.write("데이터: " + new_serial_line) self.wfile.write("\n\n")

다른 모든 것은 아마도 변경되지 않은 상태로 유지될 수 있지만 ...

먼저 다음 내용으로 index.html 파일을 만들었습니다.

헤더


가장 흥미로운 것은 라인입니다.
COM 포트에서 다음 줄을 출력하는 장소를 형성하는 자바 스크립트 스크립트

실제로 웹 서버에서 스트림을 읽고 읽은 정보를 지정된 위치에 출력합니다.

예를 들어 디스크나 다른 웹 서버에서 브라우저에서 이 파일을 열려고 했지만 작동하지 않았습니다. 디스크에서 페이지를 열 때 자바 스크립트 스크립트는 실행 중인 Python 웹 서버에 한 번 액세스하고 즉시 연결을 끊었습니다. 나는 왜 이런 일이 일어나는지 이해하지 못했고 이것이 다양한 공격에 대한 일종의 브라우저 보호일 수 있다고 제안했습니다. 그는 페이지 자체가 한 소스에서 열리고 스크립트가 다른 소스에서 데이터를 읽는 것을 좋아하지 않을 것입니다.

따라서 이 html 페이지도 제공할 수 있도록 Python 웹 서버를 변경하기로 결정했습니다. 그런 다음 페이지와 스트림이 모두 동일한 소스에서 읽혀지는 것으로 나타났습니다. 보안에 대한 내 가정이 맞는지 아니면 다른 것이 맞는지는 모르겠지만 이 구현으로 모든 것이 제대로 작동했습니다.

물론 Handler 요청 핸들러 클래스만 변경하면 됩니다.
class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # DNS 조회 로깅 비활성화 def address_string(self): return str(self.client_address) def do_GET(self): if self.path == "/" or self.path == "/index .html": self.process_index() elif self.path == "/get_serial": self.process_get_serial() else: self.process_unknown() def process_index(self): self.send_response(200) self.send_header("콘텐츠 -type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(open("index.html").read()) self.wfile.write("\n\ n") self.wfile.flush() def process_get_serial(self): self.send_response(200) self.send_header("Content-type", "text/event-stream") self.end_headers() try: while True: new_serial_line = get_full_line_from_serial() new_serial_line이 None이 아닌 경우: self.wfile.write("data: " + new_serial_line) self.wfile.write("\n\n") self.wfile.flush() 제외 socket.error, e : "클라이언트 연결이 끊어졌습니다.\n" 인쇄 def process_unknown(self): self.send_response(404)
이 옵션은 웹 서버가 "/index.html"(페이지의 html 코드 제공) 및 "/get_serial"(COM 포트에서 읽는 끝없는 문자열 스트림 제공)의 두 가지 요청에만 응답한다고 가정합니다. 다른 모든 요청은 404 코드로 응답됩니다.

index.html은 Python 웹 서버에서 제공하므로 COM 포트에서 문자열 스트림의 절대 주소 대신 상대 주소를 지정하여 약간 수정할 수 있습니다.

var 소스 = new EventSource("http://192.168.1.207:8000/")
~로 교체되다
var 소스 = 새로운 EventSource("/get_serial")
그 결과 다음과 같이 밝혀졌습니다.

여기서 멈추기로 결정했습니다. 페이지를 아름답게 디자인하는 것은 이미 매우 간단해야 한다고 생각합니다. 그러나 나는 HTML이나 CSS에 능숙하지 않으므로 다른 사람에게 시키십시오. COM 포트에서 데이터를 보내는 웹 서비스를 만드는 것이 전혀 어렵지 않다는 것을 보여주는 작업을 보았습니다.

다시 한 번 반복합니다. 제시된 코드는 "생산에 투입"할 수 있는 완전한 솔루션이 아닙니다. 이것은 문제를 해결하기 위한 근본적인 접근 방식을 보여주는 프로토타입일 뿐입니다.

그 밖에 작업할 수 있는 작업:

  • 첫째, python 스크립트의 COM 포트에서 데이터를 읽는 것은 매우 "서투르게" 수행됩니다. 사실, "새로운 것이 있습니까?"라는 지속적인 폴링이 있습니다. 물론 이 접근 방식은 프로세서를 로드하고 내 컴퓨터의 코어 하나가 100% 사용됩니다.
    시간 초과가 있는 차단 읽기를 솔루션으로 사용할 수 있습니다. 이렇게 하려면 COM 포트를 열 때 0이 아닌 값(초)을 시간 초과로 지정하면 충분합니다. 예를 들면 다음과 같습니다.
    ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, 시간 제한=0.03)
    또한 pySerial 모듈 설명에는 "TCP/IP - 직렬 브리지", "단일 포트 TCP/IP - 직렬 브리지(RFC 2217)" 및 "다중 포트 TCP /IP - 직렬 브리지(RFC 2217)" - 전문가가 이러한 문제를 해결하는 방법을 볼 수 있습니다.
  • 둘째, 하나의 클라이언트만 데이터를 수신할 수 있습니다. 첫 번째 클라이언트에서 페이지가 닫힐 때까지 해당 서버에 연결하여 두 번째 컴퓨터에서 값을 가져올 수 없습니다. 한편으로 이것은 아마도 정확할 것입니다. 하나의 COM 포트만 있고 여러 소비자가 있습니다. 그 중 어느 소비자가 읽기 라인을 제공해야 합니까? 이 질문에 대한 대답이 "모든 사람"이어야 한다고 생각한다면 여기에 문제에 대한 제 생각이 있습니다. 동시에 여러 웹 클라이언트의 요청을 처리할 수 있는 "정직한" 다중 스레드 웹 서버(예: 일부 Tornado 또는 Flask)를 사용해야만 문제를 해결할 수 없는 것 같습니다. 각 스레드에서 COM 포트를 열고 읽을 수 없기 때문에 이 경우 COM 포트의 데이터는 하나의 스레드/프로세스로만 이동합니다. 따라서 제 생각에는 서버 부분을 두 부분으로 나눌 필요가 있습니다.
    • COM 포트와 함께 작동하는 zmq 서버에서 라인을 읽고 PUB 소켓을 통해 관심 있는 모든 소비자에게 보냅니다.
    • COM 포트에 연결하는 대신 python 웹 서버가 zmq 서버에 연결하여 데이터를 수신합니다.
    ZMQ(ZeroMQ) 라이브러리에 익숙하지 않다면 일반 TCP/IP 또는 UDP 소켓을 대신 사용할 수 있지만 ZMQ에 익숙해지는 것이 좋습니다. 이 라이브러리를 사용하면 이러한 문제를 매우 쉽게 해결할 수 있기 때문입니다. ZMQ의 도움으로 솔루션은 최대 20줄에 들어갈 것 같습니다. (쓰기를 거부할 수 없습니다. 설명된 문제를 해결할 계획이 없더라도 작업이 스레드/프로세스 간의 데이터 교환이 포함된 다중 스레드/다중 프로세스 프로그래밍과 관련이 있는 경우 이 라이브러리를 자세히 살펴보세요. - 아마도 이것이 당신이 오랫동안 꿈꿔온 이야기일 것입니다)
  • 데이터 흐름은 COM 포트에서 웹 브라우저까지 여전히 단방향입니다. 아직 브라우저에서 Arduino로 데이터를 보낼 수 없습니다. 이 작업도 그리 어렵지 않고 이전 작업과 달리
    • 다중 스레드 서버 사용
    • 매개변수가 있는 GET 요청을 수락하고 그 중 특정 값을 COM 포트로 전송하도록 Handler.do_GET 메소드 개선
    제 생각에는 아두이노 IDE에 내장된 웹 기반 직렬 포트 모니터의 본격적인 아날로그를 작성하고 싶다면 그렇게 어렵지 않습니다. 개인적으로 나 자신은 일반 프론트엔드를 만드는 데만 어려움이 있다고 봅니다.
  • 아직 브라우저를 통해 COM 포트의 이름과 작동 매개변수를 설정할 수 없습니다. 한편으로 이것은 논리적으로 보입니다. 지구 반대편의 사용자가 arduino가 연결된 COM 포트와 속도를 어떻게 알 수 있습니까? 그러나 동일한 컴퓨터에서 실행되는 Python 웹 서버는 확실히 알고 있습니다. 그러나 사용자에게 COM 포트의 이름이나 해당 작업의 매개변수를 변경할 수 있는 기회를 제공하는 것이 여전히 바람직한 경우 다시 Handler.do_GET 메서드를 수정하여 이 문제를 쉽게 해결할 수 있습니다.
  • 서버를 실행하려면 python이 필요합니다. 이것은 일반적으로 어렵지 않지만 어떤 이유로 이것을 수행할 수 없거나 원하지 않는 경우 pyInstaller가 구출될 수 있습니다. 이를 통해 Python 스크립트는 arduino가 연결된 컴퓨터에 쉽게 복사할 수 있는 하나의 실행 파일(Windows의 경우 - .exe)로 컴파일할 수 있습니다.
    아마도 가장 좋은 해결책은 이 경우 Go 언어를 사용하는 것입니다. 내가 아는 한 "배포"용 파일을 만드는 문제를 더 잘 해결합니다.
결론: "이 문제를 이미 만들어진 클라우드를 통해 해결하는 것이 더 쉽지 않습니까?"라는 질문이 제기될 수 있습니다. 클라우드의 COM 포트에서 읽을 수 있는 데이터를 게시하고 클라이언트에서 클라우드의 해당 서비스에 액세스하기만 하면 되는 이유는 무엇입니까? 아마도 그러한 솔루션도 존재할 권리가 있지만 그러한 솔루션을 적용하기 전에 다음 질문에 답해야 합니다.
  • 필요한 속도/빈도로 데이터를 게시할 수 있는 기성 웹 서비스가 있습니까? 그들 중에 무료가 있습니까? 아니면 해당하는 돈을 지불할 준비가 되셨습니까?
  • 클라우드가 떨어지거나 클라우드에 연결되는 경우 데이터 없이 남게 될 것이라는 사실에 대비하고 있습니까?
  • 한 방에서 다른 방으로 데이터를 전송하기 위해 그들이 바다나 대륙의 절반을 두 번 건너야 한다는 것이 당신을 괴롭히지 않습니까?

그래서 우리는 COM 포트에 도착했습니다. 그러나 LPT를 사용하면 모든 것이 LPT만큼 간단하지 않으며 완전히 사용하려면 훨씬 더 많은 노력이 필요합니다. 주요 걸림돌은 주요 이점인 직렬 형식의 데이터 전송입니다. LPT에서 데이터 바이트가 각각 1비트씩 8라인을 통해 전송되고 각 라인의 상태를 쉽게 볼 수 있다면 COM 포트에서 데이터 바이트는 한 라인을 따라 비트 단위로 전송됩니다(물론 접지와 관련하여 ) LED만으로는 전송되는 내용이 작동하지 않습니다. 이렇게하려면 직렬 데이터 스트림을 소위 병렬로 변환하는 특수 장치가 필요합니다. USART(범용 동기/비동기 수신기 송신기). 예를 들어, 더 심각한 마이크로 컨트롤러에서 COM 포트가 장착된 컴퓨터의 마더보드에 포함됩니다.


나는 당신이 여전히 COM 포트를 마스터하는 것을 낙담하기를 바랍니다. 모든 것이 그렇게 우울하지 않습니다. 일부 결과는 USART 없이 얻을 수 있습니다. COM 포트 작업의 초기 단계에서 구현하는 작업을 공식화해 보겠습니다.


"LED가 COM 포트를 통해 컴퓨터에 연결되기를 원합니다. 프로그램을 실행합니다. 이 프로그램에서 어떤 작업을 수행하면 LED가 켜지고 다른 작업을 수행하면 LED가 꺼집니다."


작업은 매우 구체적이며(USART가 사용되지 않는다는 점을 감안할 때) 순수한 "자체 제작"이지만 상당히 실행 가능하고 실행 가능합니다. 구현을 시작해 보겠습니다.


1.COM 포트

다시, 우리는 당신의 PC의 시스템 장치를 가지고 후면을 봅니다. 9핀 커넥터가 있습니다. 이것은 COM 포트입니다. 실제로는 여러 개(최대 4개)가 있을 수 있습니다. 내 PC에는 두 개의 COM 포트가 있습니다(사진 참조).


2. COM 포트 확장


3. 하드웨어

LPT 포트의 첫 번째 장치보다 더 어려울 것이라는 의미에서 하드웨어 부분도 "땜질"해야 합니다. 사실 COM 포트에서 데이터를 교환하는 RS-232 프로토콜은 논리적 상태-전압의 비율이 약간 다릅니다. 일반적으로 논리 0 0 V, 논리 1 +5 V인 경우 RS-232에서 이 비율은 논리 0 +12 V, 논리 1 -12 V입니다.

예를 들어 -12V를 수신한 경우 이 전압으로 무엇을 해야 하는지 즉시 명확하지 않습니다. 일반적으로 RS-232 레벨은 TTL(0.5V)로 변환됩니다. 가장 쉬운 옵션은 제너 다이오드입니다. 그러나 나는이 변환기를 특별한 마이크로 회로로 만들 것을 제안합니다. MAX232라고 합니다.

이제 COM 포트의 어떤 신호가 LED에서 볼 수 있는지 봅시다. 실제로 COM 포트에는 인터페이스 장치 개발자가 관심을 갖는 6개의 독립 라인이 있습니다. 직렬 데이터 라인 중 두 가지는 아직 사용할 수 없습니다. 그러나 나머지 4개는 데이터 전송 프로세스를 제어하고 나타내도록 설계되었으며 필요에 맞게 "전송"할 수 있습니다. 그 중 2개는 외부 장치에 의해 제어되도록 설계되었으며 지금은 만지지 않겠지만 이제 마지막 남은 2개 라인을 사용합니다. 그들은 다음과 같이 불립니다.

  • RTS- 전송 요청. 컴퓨터가 데이터를 수신할 준비가 되었음을 나타내는 상호 작용 라인.
  • DTR- 컴퓨터가 준비되었습니다. 컴퓨터가 켜져 있고 통신할 준비가 되었음을 나타내는 상호 작용 라인.

이제 우리는 그들의 목적을 약간 전달하고 그들에 연결된 LED는 우리 프로그램의 작업에 따라 꺼지거나 켜집니다.

따라서 계획된 작업을 수행할 수 있는 계획을 구성해 보겠습니다.

그리고 여기에 실제 구현이 있습니다. 나는 그런 "매우 생산적인" 회로를 위한 보드를 만들고 싶지 않기 때문에 내가 그런 멍청한 브레드보드 버전으로 만든 것을 당신이 용서할 것이라고 생각합니다.


4. 소프트웨어 부분

여기에서는 모든 것이 더 빠릅니다. Microsoft Visual C++ 6.0에서 MFC 기반의 Windows 응용 프로그램을 만들어 COM 포트의 두 통신 회선을 관리해 보겠습니다. 이렇게 하려면 새 MFC 프로젝트를 만들고 이름을 지정합니다. 예를 들면 다음과 같습니다. 테스트컴. 다음으로 대화를 기반으로 구축 옵션을 선택합니다.

그림과 같이 프로그램의 대화 상자 모양을 지정하십시오. 아래에, 즉 각 줄에 대해 2개씩 4개의 버튼을 추가합니다. 그 중 하나는 라인을 "지불"하기 위해 각각 필요하고 다른 하나는 라인을 "설정"하기 위해 필요합니다.

클래스 CTestCOMDlg: public CDialog ( // 생성 public: CTestCOMDlg(CWnd* pParent = NULL); // 표준 생성자 HANDLE hFile;

우리 프로그램이 COM 포트의 라인을 관리하려면 먼저 열어야 합니다. 프로그램이 로드될 때 포트를 여는 코드를 작성해 봅시다.

HFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("포트를 열지 못했습니다!", "오류", MB_ICONERROR); ) else ( MessageBox("포트가 성공적으로 열렸습니다.", "Ok", MB_OK); )

표준 Win API 기능 사용 파일 만들기() COM 포트 열기 COM2. 다음으로 정보 메시지의 출력으로 오프닝의 성공을 확인합니다. 여기에서 중요한 말을 할 필요가 있습니다. COM2는 내 컴퓨터에 있으며 컴퓨터에서 다른 COM 포트에 연결할 수 있습니다. 따라서 사용 중인 포트로 이름을 변경해야 합니다. 컴퓨터에 있는 포트 번호를 확인하려면 다음과 같이 하십시오. 시작 -> 설정 -> 제어판 -> 시스템 -> 하드웨어 -> 장치 관리자 -> 포트(COM 및 LPT).

마지막으로 기능 CTestCOMDlg::OnInitDialog()파일에 위치 테스트COMDlg.cpp, 대화 클래스는 다음 형식을 취해야 합니다.

BOOL CTestCOMDlg::OnInitDialog() ( CDialog::OnInitDialog(); // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다. // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); ) ) // 이 대화 상자의 아이콘을 설정합니다. 프레임워크는 이 작업을 자동으로 수행합니다. // 응용 프로그램의 기본 창이 대화 상자가 아닌 경우 SetIcon(m_hIcon, TRUE); // 큰 아이콘 설정 SetIcon(m_hIcon, FALSE); // 작은 아이콘 설정 // TODO: 여기에 추가 초기화 추가 hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("포트를 열지 못했습니다!", "오류", MB_ICONERROR); ) else ( MessageBox("포트가 성공적으로 열렸습니다", "Ok", MB_OK); ) return TRUE; // 컨트롤에 포커스를 설정하지 않으면 TRUE를 반환 )

이제 라인 제어 버튼 핸들러를 추가해 보겠습니다. 적절한 이름을 지정했습니다. DTR 라인을 1로 설정하는 함수는 OnDTR1()이고 0은 OnDTR0()입니다. 비슷한 방식으로 RTS 라인에 대해 각각. 버튼을 더블 클릭하면 핸들러가 생성된다는 것을 상기시켜 드리겠습니다. 결과적으로 이 네 가지 기능은 다음과 같은 형식을 취해야 합니다.

Void CTestCOMDlg::OnDTR1() ( // TODO: 여기에 제어 알림 처리기 코드 추가 EscapeCommFunction(hFile, 6); ) void CTestCOMDlg::OnDTR0() ( // TODO: 여기에 제어 알림 처리기 코드 추가 EscapeCommFunction(hFile, 5); ) void CTestCOMDlg::OnRTS1() ( // TODO: 여기에 제어 알림 처리기 코드 추가 EscapeCommFunction(hFile, 4); ) void CTestCOMDlg::OnRTS0() ( // TODO: 여기에 제어 알림 처리기 코드 추가 EscapeCommFunction(hFile, 3); )

그들이 어떻게 작동하는지 조금 설명하겠습니다. 보시다시피 내부에는 동일한 Win API 함수에 대한 호출이 포함되어 있습니다. EscapeCommFunction()두 가지 옵션이 있습니다. 그 중 첫 번째는 열린 포트에 대한 핸들(HANDLE)이고, 두 번째는 필요한 라인 상태에 해당하는 특수 작업 코드입니다.

모든 것, 컴파일, 실행. 모든 것이 정상이면 포트가 성공적으로 열렸다는 메시지가 표시됩니다. 또한 해당 버튼을 눌러 COM 포트에 연결된 LED를 깜박입니다.

© 이바노프 드미트리
2006년 12월