파 이 썬 연결 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)을 사 용 했 습 니 다.지원 하 는 통신 설정 은 다음 과 같다.
여기 서 포트 율 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
대응 하 는 ASCII0x0D
와0x0A
;명령 이 끝 난 후에 구분자 로 나 누 는 것 이다.데이터 문자 형식
보 낸 데이터 에서 숫자 를 보 내 려 면 숫자 문자 와 같 아야 합 니 다.예 를 들 어 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 을 연결 하 는 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.