Я новичок в Arduino и Python, и у меня есть идея, но я не могу заставить ее работать. В принципе, когда в Arduino нажата кнопка, она отправляет "4" через последовательный порт. То, что я хочу в Python, - это как только он читает 4, он должен что-то сделать. Это то, что я получил до сих пор:
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?
Я не знаю хорошего способа синхронизации сообщений с readLine
, так как это не блокирующий вызов. Вы можете использовать ser.read(numBytes)
, который является блокирующим вызовом. Вам нужно будет знать, сколько байтов Arduino отправляет, хотя правильно декодирует поток байтов. Вот простой пример, который читает 8 байтов и распаковывает их в 2 беззнаковых шорт и длинную (часть <HHL
) в Python
try:
data = [struct.unpack('<HHL', handle.read(8)) for i in range(PACKETS_PER_TRANSMIT)]
except OSError:
self.emit(SIGNAL("connectionLost()"))
self.connected = False
Здесь ссылка на struct.unpack()
Код Arduino, который идет с этим. Он считывает два значения аналоговых датчиков и микрометку времени и отправляет их по серийному номеру.
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 и форумы по обработке являются хорошими местами для поиска такого кода.
UPDATE
Думаю, я мог бы ввести вас в заблуждение, readLine
не блокировать. В любом случае вышеуказанный код должен работать. Я также нашел этот другой поток в отношении того же предмета.
ОБНОВЛЕНИЕ Вам не нужно использовать аналоговые датчики, именно так, как я использовал проект, вы, конечно же, можете передавать какие-либо значения в течение серийного номера. Итак, что делает код Arduino, он имеет буфер типа byte
, где вывод хранится перед отправкой. Затем значения датчика и микрофоны записываются в буфер, а буфер отправляется через последовательный порт. (SensA & 0xFF)
- это оператор битовой маски, который принимает битовый шаблон значения SensA
и маскирует его с битовой диаграммой 0xFF
или 255 в десятичной форме. Essetianlly принимает первые 8 бит из 16-битного значения SensA
, который является коротким Arduino. следующая строка делает то же самое, но сдвигает биты на 8 позиций, беря последние 8 бит.
Для этого вам нужно понять битовые шаблоны, бит-маскирование и смещение битов. Затем буфер записывается в последовательный файл.
В свою очередь, код Python считывает биты из последовательного порта по 8 бит за раз. Посмотрите на документы struct.unpack. Для понимания существует только возможность отправки более одного набора значений. Поскольку плата Arduino и код Python не синхронизированы, я добавил, что для отправки более чем одной "линии" для каждой передачи. Вы можете просто заменить это на struct.unpack('<HHL',handle.read(8))
. Помните, что "handle.read()" принимает несколько байтов, где, поскольку код отправки 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"