내 목표는 문자열 요소, 정수, 기타 바이트 배열 등으로 채울 수있는 바이트 배열을 설정하는 것입니다. 결국이 바이트 배열을 직렬 인터페이스로 보내고 싶습니다.
예를 들어 :
preamble = "ABC"
payloadSize = 10 #supposed to represent a uint32_t value
payload = bytearray(payloadSize)
crc = bytearray(4);
postamble = "CBA"
이것은 이제 단일 바이트 배열에 연결되어 다음으로 공급 될 수 있습니다.
import serial
ser = serial.Serial(...)
txBuffer= bytearray(...)
#... adding here "somehow" the preamble, payloadsize, payload, crc and postamble to the txBuffer.
ser.write(txBuffer)
패킷의 모양
b'A B C 0 0 0 10 pp pp pp pp pp pp pp pp pp pp cc cc cc cc C B A'
pp는 페이로드 바이트로 유지되고 cc는 crc 바이트로 유지됩니다.
주석 처리 후 "a"해결책을 찾았고 시도 및 오류 ... (댓글의 경우 thx) :
index = 3
txBuffer[:index] = bytes(preamble, 'ascii')
txBuffer[index] = payloadSize >> 24 & 0xFF
index += 1
txBuffer[index] = payloadSize >> 16 & 0xFF
index += 1
txBuffer[index] = payloadSize >> 8 & 0xFF
index += 1
txBuffer[index] = payloadSize & 0xFF
for i in range(index, payloadSize):
txBuffer[i] = payload[i]
index += payloadSize
txBuffer[index] = crc[0]
index += 1
txBuffer[index] = crc[1]
index += 1
txBuffer[index] = crc[2]
index += 1
txBuffer[index] = crc[3]
txBuffer[index:] = postamble
음,이게 효과가있을 것입니다. 더 나은 방법에 대한 권장 사항이 있습니까?
이제 단일 바이트 배열에 연결되어야합니다.
글쎄, 당신은 bytearrays 또는 bytearrays를 b'...'
문자열 과 연결할 수 있습니다 .
>>> bytearray(b'abc') + b'def'
bytearray(b'abcdef')
int 인코딩에 관해서는 struct
라이브러리 가 원하는 것일 수 있습니다. 예를 들어 little-endian unsigned long 패킹 ( 해당 페이지의 Format Strings 부분 참조) :
>>> struct.pack("<L", 0x11121314);
b'\x14\x13\x12\x11'
그래서 대체로 이런 일이 가능할까요?
preamble = b'ABCD'
payload = b'hello!\0'
payloadsize = len(payload)
txbuf = bytearray(preamble + struct.pack("!L", payloadsize) + payload)
이제 txbuf
해야한다 bytearray(b'ABCD\x00\x00\x00\x07hello!\x00')
.
또는 미리 할당하고 제자리에 채우려면 그게 중요한지 전혀 알지 못합니다.
txbuf = bytearray(20)
txbuf[0:4] = preamble
txbuf[4:8] = struct.pack("!L", payloadsize)
txbuf[8: 8 + payloadsize] = payload
그대로 두어야합니다 bytearray(b'ABCD\x00\x00\x00\x07hello!\x00\x00\x00\x00\x00\x00')
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다