2011-01-22 2 views
1

저는 Arduino와 Python 모두 초보자입니다. 아이디어가 있지만 작동시키지 못합니다. 기본적으로 Arduino에서 버튼을 누르면 직렬 포트를 통해 "4"가 전송됩니다. 파이썬에서 내가 원하는 것은 4를 읽자 마자 무언가를해야한다.Python의 Arduino에서 보낸 최신 문자 읽기

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if ser.inWaiting() > 0: 
    ser.readline(1) 
    print "hello" 

그러나 분명히이 상관없이 안녕하세요 인쇄합니다 : 이것은 내가 지금까지 무엇을 가지고 있습니다. 내가 필요한 것은 다음과 같습니다 :

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if ser.inWaiting() > 0: 
    ser.readline(1) 
    if last.read == "4": 
    print "hello" 

어떻게 last.read를 정의 할 수 있습니까?

답변

1

차단 호출이 아니기 때문에 통신을 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 코드가 비트를 처리 할 때 바이트 수를 사용한다는 것을 기억하십시오.

+0

당신이 조금 더 설명해 주시겠습니까? 그리고 왜 아날로그 센서를 사용해야합니까? 죄송합니다. 초보자는 여기 :) 다른 스레드를 보았지만 실제로 문제를 해결하지 못했습니다. – HankSmackHood

0

는 나는이 수정 작업을 것 같아요 :

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if (ser.inWaiting() > 0): 
    ser.readline(1) 
    print "hello" 
관련 문제