파이썬으로 시리얼통신을 위한 가변데이터 만들기
2018.01.17 03:45
간단 예제.
STX 제외한 데이터 길이 계산, Xor 체크섬, 충돌방지용 제어문자(=DLE) 추가 등을 한다.
def addDLE(data):
# 온리 Data만 DLE 추가. CMD, STX, ETX, chkSUM 모두 안 붙임.
result = bytes()
for b in bytearray(data):
# int to bytes
# https://stackoverflow.com/questions/21017698/converting-int-to-bytes-in-python-3
# 데이터 내 아래 조건의 코드 앞에 충돌방지 목적으로 DLE(=FF) 추가
if b == bytes({b}) == '\x02' or bytes({b}) == b'\x03' or bytes({b}) == b'\x01':
result = result + b'\xFF' + bytes({b})
else:
result = result + bytes({b})
return result
def getPacketLen(data):
# 2: 길이(2byte), 1: 체크섬
len_int = len(packet_pre) + 2 + 1
result = len_int.to_bytes(2, 'big') # ARM: Big Endian
# result = len_int.to_bytes(2, 'little') # Intel: Little Endian
return bytes(result)
def bXor(b1, b2): # use xor for bytes
result = bytearray()
for b1, b2 in zip(b1, b2):
result.append(b1 ^ b2)
return bytes(result)
import codecs
def getChkSum(data):
ba_data = bytearray(data)
chksum = bytes()
for b in range(0, len(data)):
if b > 0:
chksum = bXor(bytes(chksum), bytes({ba_data[b]}))
else:
chksum = bXor(bytes(b'\x00'), bytes({ba_data[b]}))
# 결과 확인용
# print(chksum)
# print(codecs.encode(chksum, "hex"))
return chksum
def byteToHex(data):
result = ''
for b in bytearray(data):
result = result + "0x{:02x}".format(b)
# print(str(hex(b)))
return result
b_stx = b'\x02'
b_etx = b'\x03'
b_cmd = b'\x01'
b_data = b'\x00\x12\x34\x56\x78\x9a\xbc\xde\xff'
# DLE(Data Link Escape) 추가
b_data = addDLE(b_data)
packet_pre = b_cmd + b_data
packet_len = getPacketLen(packet_pre)
# CheckSum: stx, etx, checksum 제외
chksum = getChkSum(packet_len + packet_pre)
packet_pre = packet_len + packet_pre + chksum + b_etx
packet = b_stx + packet_pre
# print(int.from_bytes(packet_len, byteorder='big')) # 리틀엔디안: Intel / 빅엔디안: ARM
print(packet.hex())
# print((byteToHex(packet)))
이노무 홈페이지 줄바꿈 늘어나는 건 어떻게 건드려야 되는겨...
끝.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
15 | 윈도우에서 Python Embeddable 사용하기 | 꿈돌이 | 2019.10.01 | 1667 |
14 | pywin32 설치/적용 | 꿈돌이 | 2018.02.21 | 3731 |
13 | Kivy 테마 -> Atlas 사용 | 꿈돌이 | 2018.02.03 | 4616 |
12 | Kivy 예제 | 꿈돌이 | 2018.02.03 | 3683 |
11 | Kivy와 Flask를 Multiprocess로 돌리기 | 꿈돌이 | 2018.02.03 | 4716 |
10 | 파이썬 시스템 시간 설정 | 꿈돌이 | 2018.01.31 | 4020 |
9 | Kivy ScreenManager 화면 전환시 진입 및 종료 | 꿈돌이 | 2018.01.31 | 864 |
8 | Kivy kvlang에서 Label 정렬 | 꿈돌이 | 2018.01.31 | 6018 |
7 |
파이썬 Kivy로 그래프 그리기 간단 예제
![]() | 꿈돌이 | 2018.01.29 | 2560 |
6 | 윈도우 파이썬(< 버전 3.6)으로 print 출력시 raw write 오류 | 꿈돌이 | 2018.01.24 | 1398 |
» | 파이썬으로 시리얼통신을 위한 가변데이터 만들기 | 꿈돌이 | 2018.01.17 | 3233 |
4 |
파이썬 Tk와 pyserial로 시리얼포트 송수신
![]() | 꿈돌이 | 2017.06.09 | 26616 |
3 |
파이썬 Kivy와 pyserial로 시리얼포트 송수신
![]() | 꿈돌이 | 2017.06.09 | 2783 |
2 | 라즈베리파이와 kivy로 작업을 처음 시작할 때 참고 | 꿈돌이 | 2017.06.08 | 1477 |
1 |
파이썬 폴더 변경시 윈도우 환경변수
![]() | 꿈돌이 | 2017.03.23 | 42228 |