Прочитать последний персонаж, отправленный из Arduino в Python - PullRequest
1 голос
/ 22 января 2011

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

Ответы [ 2 ]

1 голос
/ 22 января 2011

Я не знаю хорошего способа синхронизации связи с 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 и форумы по обработке - хорошие места для поиска кода такого рода.

ОБНОВЛЕНИЕ Думаю, я мог ввести вас в заблуждение, когда readLine не блокирует.В любом случае приведенный выше код должен работать.Я также нашел этот другой поток в SO по той же теме.

ОБНОВЛЕНИЕ Вам не нужно использовать аналоговые датчики, это именно то, что я сделал в проектеЕсли вы используете, вы, конечно, можете передавать любые значения через серийный номер.Итак, что делает код Arduino, так это то, что он имеет буфер типа byte, в котором выходные данные сохраняются перед отправкой.Значения датчика и микросхемы затем записываются в буфер, а буфер отправляется через последовательный порт.(SensA & 0xFF) - это оператор битовой маски, который берет битовую комбинацию значения SensA и маскирует ее битовой комбинацией 0xFF или 255 в десятичном виде.В сущности, это берет первые 8 бит из 16-битного значения SensA, которое является коротким Arduino.следующая строка делает то же самое, но сдвигает биты вправо на 8 позиций, тем самым занимая последние 8 битов.

Для этого вам необходимо понять битовые комбинации, маскирование битов и их сдвиг.Затем буфер записывается в последовательный порт.

Код Python, в свою очередь, считывает биты последовательного порта по 8 битов за раз.Взгляните на документы struct.unpack.Для понимания есть только возможность отправки более одного набора значений.Поскольку плата Arduino и код Python не синхронизированы, я добавил, что можно отправлять более одной «строки» на передачу.Вы можете просто заменить это на struct.unpack('<HHL',handle.read(8)).Помните, что «handle.read ()» занимает несколько байтов, тогда как код отправки Arduino имеет дело с битами.

0 голосов
/ 27 июля 2017

Я думаю, что это может работать с этими модификациями:

import serial
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600)
var = 1
while var == 1:
    if (ser.inWaiting() > 0):
     ser.readline(1)
     print "hello"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...