본문 바로가기

프로그래밍

파이썬으로 오실로스코프(DHO924S) 화면 캡처

파이썬으로 화면 캡처를 하는 코드를 만들었습니다. visa 라이브러리를 사용하는 방법과 socket 통신을 사용하는 방법 두 가지가 있는데 socket 통신을 사용하는 방법으로 했습니다. 추후 visa를 사용하는 방법도 파이썬으로 구현해 보겠습니다. socket 라이브러리는 파이썬 배포판에 포함되어 있는 라이브러리로 따로 설치할 필요는 없습니다. socket 통신의 경우 port 번호를 알아야 합니다. 대부분의 계측기의 경우 5555나 5025등을 많이 사용합니다. 리골 오실로스코프의 경우 5555를 사용하고 있습니다.

실행을 위해서는 IP 주소는 현재 오실로스코프에서 확인하던가 이전에 올린 파이썬 코드로 확인 후에 수정해서 동작시켜야 합니다. 아래 링크는 파이썬으로 오실로스코프의 IP 어드레스를 알아내는 코드를 설명하고 있습니다.

 

2026.10.05 - [프로그래밍] - 파이썬으로 오실로스코프(DHO924S) 계측기 IP 주소 찾기

 

파이썬으로 오실로스코프(DHO924S) 계측기 IP 주소 찾기

요즘 나오는 대부분의 오실로스코프는 전면에 USB-A 포트가 있어서 USB 메모리를 연결해 오실로스코프에 표시된 이미지를 캡처하던가 측정 데이터를 가져올 수 있습니다. 리골 오실로스코프의 경

blog.darksnake.kr

 

세 번째 줄 IP = "192.168.0.36" 부분을 사용하고 있는 오실로스코프의 IP 주소를 입력합니다.

 

import socket
import struct

IP = "192.168.0.36"
PORT = 5555
TIMEOUT = 5
OUT_FILE = "dho924s_capture.png"

def recv_exact(sock, size):
    """지정한 바이트 수만큼 정확히 수신"""
    buf = b""
    while len(buf) < size:
        chunk = sock.recv(size - len(buf))
        if not chunk:
            raise ConnectionError("소켓이 중간에 종료되었습니다.")
        buf += chunk
    return buf

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.settimeout(TIMEOUT)
    s.connect((IP, PORT))

    # (선택) 화면 정지 – 안정성 향상
    s.sendall(b":STOP\n")

    # PNG 캡처 요청
    s.sendall(b":DISP:DATA? PNG\n")

    # ---- SCPI Binary Block 파싱 ----
    # 형식: #<N><len><data>
    # 예: #9123456<PNG data>

    # '#' 확인
    first = recv_exact(s, 1)
    if first != b"#":
        raise ValueError("SCPI 바이너리 블록이 아닙니다.")

    # 길이 자릿수 N
    n_digits = int(recv_exact(s, 1))
    # 데이터 길이
    data_len = int(recv_exact(s, n_digits))

    # 실제 PNG 데이터
    png_data = recv_exact(s, data_len)

    # 파일 저장
    with open(OUT_FILE, "wb") as f:
        f.write(png_data)

    # (선택) 다시 RUN
    s.sendall(b":RUN\n")

print(f"캡처 완료: {OUT_FILE}")

 

 

[그림 1]은 캡처한 이미지입니다.

[그림 1] 오실로스코프 캡처 이미지

 

이더넷으로 화면 이미지만 캡처할 수 있는 것은 아니고 측정 데이터도 수집할 수 있습니다. 이 부분은 따로 게시하겠습니다.