Прочитать последний персонаж, отправленный из Arduino в Python

1

Я новичок в 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?

Теги:
arduino

2 ответа

1
Лучший ответ

Я не знаю хорошего способа синхронизации сообщений с 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 имеет дело с битами.

  • 0
    Не могли бы вы объяснить это немного больше? И зачем мне использовать аналоговые датчики? Извините, новичок здесь :) Я видел другую ветку, но, похоже, она не решила мою проблему.
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"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню