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