차단 호출이 아니기 때문에 통신을 readLine
과 동기화하는 좋은 방법을 모르겠습니다. 차단 호출 인 ser.read(numBytes)
을 사용할 수 있습니다. Arduino가 바이트 스트림을 올바르게 디코딩하기 위해 얼마나 많은 바이트를 보내고 있는지 알고 있어야합니다. 여기에서 8 바이트를 판독
try:
data = [struct.unpack('<HHL', handle.read(8)) for i in range(PACKETS_PER_TRANSMIT)]
except OSError:
self.emit(SIGNAL("connectionLost()"))
self.connected = False
여기 파이썬
2 부호 팬티 긴합니다 (
<HHL
부)로 압축을 풀고 간단한 예는 어울려
struct.unpack()
아두 이노 코드에 대한 참조는 것 인 . 2 개의 아날로그 센서 값과 마이크로 타임 스탬프를 읽고이를 직렬로 보냅니다.
unsigned int SensA, SensB;
byte out_buffer[64];
unsigned int buffer_head = 0;
unsigned int buffer_size = 64;
SensA = analogRead(SENSOR_A);
SensB = analogRead(SENSOR_B);
micr = micros();
out_buffer[buffer_head++] = (SensA & 0xFF);
out_buffer[buffer_head++] = (SensA >> 8) & 0xFF;
out_buffer[buffer_head++] = (SensB & 0xFF);
out_buffer[buffer_head++] = (SensB >> 8) & 0xFF;
out_buffer[buffer_head++] = (micr & 0xFF);
out_buffer[buffer_head++] = (micr >> 8) & 0xFF;
out_buffer[buffer_head++] = (micr >> 16) & 0xFF;
out_buffer[buffer_head++] = (micr >> 24) & 0xFF;
Serial.write(out_buffer, buffer_size);
Arduino 놀이터 및 처리 포럼은 이러한 종류의 코드도 둘러 볼 수있는 좋은 장소입니다.
업데이트 readLine
을 차단하지 않았을 것으로 생각됩니다. 어느 쪽이든 위의 코드가 작동해야합니다. 나는 또한 동일한 주제에 관해서 이것에 other thread을 발견했다.
업데이트 아날로그 센서를 사용할 필요가 없습니다. 내가 사용했던 프로젝트 였을뿐입니다. 물론 직렬을 통해 가치가있는 것을 자유롭게 전달할 수 있습니다. 그래서 Arduino 코드는 출력이 저장되기 전에 저장되는 타입이 byte
인 버퍼를 가지고 있습니다. 그런 다음 센서 값과 마이크로는 버퍼에 기록되고 버퍼는 직렬로 전송됩니다. (SensA & 0xFF)
은 SensA
값의 비트 패턴을 취해 비트 패턴 0xFF
또는 255로 비트 마스크를 마스크하는 비트 마스크 연산자입니다. Essetianlly 이것은 Arduino 단락 인 SensA
의 16 비트 값에서 처음 8 비트를 취합니다. 다음 라인은 똑같은 일을하지만 8 비트만큼 오른쪽으로 이동하여 마지막 8 비트를 취합니다.
비트 패턴, 비트 마스킹 및 비트 시프트를 이해해야합니다. 그런 다음 버퍼가 직렬로 기록됩니다.
파이썬 코드는 차례대로 직렬 포트에서 비트를 한 번에 8 비트 읽습니다. struct.unpack 문서를 살펴보십시오. 이해를 위해 하나 이상의 값 집합을 전송할 수 있습니다. Arduino 보드와 Python 코드가 동기화되지 않아 전송 당 둘 이상의 "회선"을 보낼 수 있다고 덧붙였다. 그냥 struct.unpack('<HHL',handle.read(8))
으로 바꿀 수 있습니다. 'handle.read() '는 Arduino send 코드가 비트를 처리 할 때 바이트 수를 사용한다는 것을 기억하십시오.
당신이 조금 더 설명해 주시겠습니까? 그리고 왜 아날로그 센서를 사용해야합니까? 죄송합니다. 초보자는 여기 :) 다른 스레드를 보았지만 실제로 문제를 해결하지 못했습니다. – HankSmackHood