파 이 썬 연결 CS2000 의 상세 한 절 차 를 총 결 하 다.

11320 단어 python잇닿다CS2000
머리말
기록 500 장 치 는 직렬 연결 및 관련 통 제 를 사용 합 니 다.
000 은 분광 복사 밝기 계,즉 광원 의 밝 기 를 측정 할 수 있다.상세 한 규격 사이트 참조CS2000/CS-2000A,모든 정 보 는 코 니 카 메 능 다 홈 페이지 의 매개 변수 와 사용 매 뉴 얼 을 위주 로 한다.
사용 목적 및 환경
현재 의 사용 목적 은 PC 단 을 사용 하여 CS2000 을 제어 하고 화면의 밝기 데 이 터 를 측정 하 는 것 이다.
PC 에서 Python 을 사용 하여 Win 10 환경 에서 개발 합 니 다.
추가 설치 가 필요 한 모듈:pySerial;
장치 연결 방법
이 장 비 는 USB 1.1 Full-Speed 와 RS-232C 를 지원 한다.세트 로 된 소프트웨어 CS-S10 은 USB 1.1 인 터 페 이 스 를 사용 하 는데 소프트웨어 가 설치 되면 해당 드라이버 를 설치 한 셈 이다.물론 직렬 통신 포트 설정COM Port(Cluster Communication Port)을 사 용 했 습 니 다.
지원 하 는 통신 설정 은 다음 과 같다.
image-20210614110048426
여기 서 포트 율 115200,데이터 길이 8 bits,검사 없 음,1 bit 정지 위치 설정 을 선택 합 니 다.Hardware(RTS/CTS),즉 Require To Send 와 Clear To Send 신 호 는 고려 하지 않 습 니 다.
프로그램 주체 프로 세 스
1.컴퓨터 COM 목록 가 져 오기;
2.CS2000 의 장치 포트 를 연결 하고 열기;
3.장치 초기 화(제어 모드 설정,테스트 버튼 조작 닫 기,동기 모드 설정 등);
4.1 차 측정 으로 측정 치 획득 하기;
5.직렬 포트 닫 기;
다음은 매 뉴 얼 과 결합 하여 조작 을 시작 하 겠 습 니 다.
포트 가 져 오기
도입 필요serial.tools.list_ports모듈:

def port_list():
    """
            
    :return:     
    """
    pl = serial.tools.list_ports.comports()
    # print(pl)
    print("Port List:")
    for item in pl:
        print("{}\t\t:\t{}".format(item.usb_description(), item.manufacturer))
포트 목록 을 가 져 오 면 포트 에 대한 설명 과 제조 업 체 를 인쇄 하여 여러 포트 를 구분 할 수 있 습 니 다.
연결 포트
도입 필요serial모듈:

def connect_com(port, baudrate=115200, timeout=0):
    """
               ;
    :param port:    ,“COM1”
    :param baudrate:    ,115200
    :param timeout:     ,0
    :return:       ,ser
    """
    # noinspection PyBroadException
    try:
        ser = serial.Serial(port, baudrate, timeout=timeout)
        print("Port\t\t:\t{}".format(ser.name))
        print("Baudrate\t:\t{}".format(ser.baudrate))
        print("Status\t\t:\t{} Connect Successful!".format(port))
        return ser
    except Exception:
        print("Status\t\t:\t\t\tConnect COM Failed!")
정 의 된 함수,직렬 포트 를 연 대상 을 되 돌려 줍 니 다.
전송 형식
구분자
측정 장치 에 PC 로 명령 을 보 낼 때 다음 과 같은 구분자 가 필요 합 니 다.CR,LF대응 하 는 ASCII0x0D0x0A;명령 이 끝 난 후에 구분자 로 나 누 는 것 이다.
데이터 문자 형식
보 낸 데이터 에서 숫자 를 보 내 려 면 숫자 문자 와 같 아야 합 니 다.예 를 들 어 10 진 데이터886를 보 내 려 면 해당 하 는 문자886를 보 내야 한다.입력 할 문자 길이 가 적 으 면 빈 칸 으로 고 쳐 야 합 니 다.
시간 을 초과 하 다
PC 통신 의 시간 초과 설정 은 최소 10s 가 필요 합 니 다.이 는 설비 가 밝 기 를 측정 하 는 데 포인트 시간 이 필요 하 다 고 이해 할 수 있다.예 를 들 어 어두 운 화면 을 테스트 하 는 데 시간 이 오래 걸 리 기 때문에 측정 한 반환 데 이 터 는 대응 지연 이 오래 걸 리 기 때문에 시간 초과 설정 은 최소 10s 이다.
실제 사용 하 는 경우 어두 운 화면 은 7s 의 측정 시간 을 초과 해 야 할 수 있다.
초기 화
초기 화 는 원 격 모드(SCMS)설정,측정 버튼(MSWE)닫 기,동기 모드(SCMS)설정 등 몇 가지 절 차 를 포함한다.여기 서 매 뉴 얼 을 자세히 참고 하면 쉽게 이해 할 수 있 고 아래 에 코드 를 직접 붙 입 니 다.

def remote_mode(ser):
    """
     cs2000        
    :param ser: cs2000   
    :return: None
    """
    data = b'RMTS,1
' tx_data(ser, data) if rx_data(ser)[0] == "OK00": print("Status\t\t:\tRemote Mode Setting OK!") else: print("Status\t\t:\tRemote Mode Setting ERROR!") def meas_key_off(ser): """ cs2000 measure :param ser: cs2000 :return: None """ data = b'MSWE,0
' tx_data(ser, data) if rx_data(ser)[0] == "OK00": # print("Status\t\t:\tMeasure Key Disable OK!") pass else: print("Status\t\t:\tMeasure Key Disable ERROR!") def sync_mode_set(ser, freq): """ :param ser: cs2000 :param freq: , Hz :return: None """ mode = b'1,' freq = freq.encode() data = b'SCMS,' + mode + freq + b'00
' tx_data(ser, data) if rx_data(ser)[0] == "OK00": print("Status\t\t:\tSync Mode is {}, freq is {}Hz!".format(mode, freq)) pass else: print("Status\t\t:\tMeasure Key Disable ERROR!") def sync_mode_read(ser): """ :param ser: cs2000 :return: None """ sync_mode_dict = {"0": "No sync", "1": "Internal sync", "2": "External sync"} data = b'SCMR
' tx_data(ser, data) rdata = rx_data(ser) if rdata[0] == "OK00": print("Status\t\t:\tSync Mode is {}. ".format(sync_mode_dict[rdata[1]])) if rdata[1] == "1": print("Status\t\t:\tSync frequency is {}Hz. ".format(rdata[2][:-2])) pass else: print("Status\t\t:\tSync Mode read ERROR!") def dev_init(ser): """ cs2000 , , , , :param ser: cs2000 :return: None """ remote_mode(ser) meas_key_off(ser) sync_mode_set(ser, SYNC_FREQ) sync_mode_read(ser)
메모:명령 을 보 낼 때마다 장치 가 데 이 터 를 되 돌려 줍 니 다.만약 에 돌아 온 것 이OK00이 라면 명령 발송 과 수신 에 문제 가 없 음 을 설명 하고 돌아 온 명령 에ERxx등 글자 가 있 으 면 매 뉴 얼 에 있 는 오류 코드 목록 에 따라 오류 원인 을 조회 하고 수정 해 야 한다.
측정 데이터
측정 데 이 터 는 먼저 측정 명령 을 보 내 고 측정 시간 을 되 돌려 주 며 측정 이 끝 날 때 까지 기 다 려 야 합 니 다.
측정 데이터 읽 기 명령 을 다시 보 냅 니 다.

def measure(ser):
    """
     cs2000       
    :param ser: cs2000   
    :return: None
    """
    data = b'MEAS,1
' tx_data(ser, data) rdata = rx_data(ser) if rdata[0] == "OK00": # print("Status\t\t:\tMeasure time is {}s".format(rdata[1])) pass else: print("Status\t\t:\tMeasure CMD ERROR Code {}".format(rdata[0])) rdata_1 = rx_data(ser) if rdata_1[0] == "OK00": # print("Status\t\t:\tMeasurement completed!") pass else: print("Status\t\t:\tMeasure Wait ERROR Code {}".format(rdata_1[0])) def lv_read(ser): """ cs2000 :param ser: cs2000 :return: lv """ data = b'MEDR,2,0,101
' tx_data(ser, data) rdata = rx_data(ser) if rdata[0] == "OK00": # print("Status\t\t:\tLuminance is {} cd/m²".format(rdata[1])) return rdata[1] else: print("Status\t\t:\tLuminance Read ERROR Code {}".format(rdata[0])) return None def get_lv(ser): """ :param ser: cs2000 :return: , cd/m² """ measure(ser) return lv_read(ser) def xylv_read(ser): """ cs2000 :param ser: cs2000 :return: ,X,Y, ,LV """ data = b'MEDR,2,0,2
' tx_data(ser, data) rdata = rx_data(ser) if rdata[0] == "OK00": print("Status\t\t:\tX,Y,LV are {} {} {}".format(rdata[1], rdata[2], rdata[3])) return rdata[1:] else: print("Status\t\t:\tMeasure ERROR!") return None def get_xylv(ser): """ X,Y LV。 :param ser: cs2000 :return: ,X,Y, ,LV """ measure(ser) return xylv_read(ser)
그 중에서 데 이 터 를 되 돌려 주 는 형식 은 보 낸 명령 에 따라 해석 해 야 하 며 해당 하 는 것 은 데이터 시트 에 도 소개 되 어 있다.
직렬 송 수신 데이터 함수
직렬 송 수신 데이터 에 대해 서도 함수 한 층 을 밀봉 하여 호출 하기에 편리 합 니 다.

def tx_data(ser, data):
    # noinspection PyBroadException
    try:
        ser.write(data)
        # print("Status\t\t:\tSend OK!")
    except Exception:
        print("Status\t\t:\tSend ERROR!")


def rx_data(ser):
    # noinspection PyBroadException
    try:
        rdata = ser.readline().decode("utf-8").replace("
", "").split(",") # print("Status\t\t:\tReceived {}".format(rdata)) return rdata except Exception: print("Status\t\t:\tReceive ERROR!")
직렬 포트 닫 기
직렬 포트 를 사용 한 후 에는 반드시 합 리 적 으로 닫 아서 여러 프로그램 이 실행 되 고 연결 문제 가 발생 하 는 것 을 방지 해 야 한다.

def serial_close(ser):
    """
          
    :return: None
    """
    # noinspection PyBroadException
    try:
        ser.close()
        print("Port {} has been closed!".format(ser.name))
    except Exception:
        print("----serial_close failed!")

주 함수
모든 매개 변 수 는 을 매개 변수 로 전달 합 니 다.

if __name__ == '__main__':

    port_list()

    cs2000 = connect_com("COM1", timeout=5)

    dev_init(cs2000)

    get_lv(cs2000)
    get_xylv(cs2000)

    serial_close(cs2000)
뒤에 쓰다
장치 디 버 깅 의 요 지 는 모든 조작 은 Datasheet:cs 를 참고 해 야 한 다 는 것 이다.2000_technicalnote_en,홈 페이지 지원 에서 다운로드 할 수 있 습 니 다.매 뉴 얼 을 익 힌 후에 뒤의 디 버 깅 절 차 는 많은 시간 을 절약 할 수 있 고 변조 과정 도 매우 순 조 롭 을 것 이다.여기 서 몇 가지 디 버 깅 과정 에서 발생 한 문 제 를 예 로 들 면:
1.시간 초과(최 장 측정 시간 에 따라 설정)를 합 리 적 으로 설정 하고 데 이 터 를 보 낸 후에 데 이 터 를 받 을 수 있 습 니 다.
2.여기 구분자 가 사용 하 는 것 은
이 고byte 로 전환 한 후에 직렬 로 보 내 는 것 입 니 다.
3.일부 모델 설정 은 한 번 만 설정 할 수 있 고 전기 가 들 어 올 때마다 설정 하지 않 아 도 되 며 안전 을 위해 초기 화 에 통일 적 으로 넣 을 수 있다.
4.어두 운 빛 환경 에서 어두 운 광원 을 테스트 하 는 데 걸 리 는 시간 이 길 고 수 동 테스트 판 은24s이 많 으 며 밝 은 광원 의 테스트 시간 은1s한 번 정도 이다.
5.프로그램 에서 직렬 포트 를 직접 매개 변수 로 전달 하 는 것 이 타당 하지 않 으 므 로 이 모듈 을class로 바 꿀 수 있 습 니 다.
나중에 다른 문제 가 생기 면 여기 서 업 데 이 트 됩 니 다.
이 항목 의 원본 주소:https://github.com/LJacki/CS2000
이 쯤 에서 파 이 썬 이 CS2000 을 연결 하 는 상세 한 절 차 를 정리 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 파 이 썬 이 000 을 연결 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기