Последовательная передача между Arduino и компьютером Linux с pySerial: проблема длительности чтения в буфере - PullRequest
0 голосов
/ 13 апреля 2020

Добрый вечер всем,

У меня есть вопрос, касающийся последовательной передачи и библиотеки Python pySerial.

Я написал две небольшие программы (ниже), одну на C для Arduino Uno и другой в Python, который читает на последовательном порту. Моя цель - прочитать значения с аналогового входа Arduino и сохранить / обработать их на моем компьютере. Передача осуществляется через последовательный порт. Я работаю под Linux Debian. В коде на стороне Arduino Uno внутри l oop значение «непрерывно» считывается с аналогового входа A0 и передается через последовательный порт (Serial.write). В Arduino Uno аналоговый вход имеет разрешение 10 бит, но для простоты здесь хранятся только 8 старших бит (1 байт).

С другой стороны, программа Python слушает и читает значения из последовательного порта в буфер.

У меня проблема на стороне Python. Я использую библиотеку "pySerial".

Используя команду "line = ser.read (buffer_size)", она считывает значения "buffer_size" на последовательном порту. Таким образом, число битов чтения равно buffer_size * 10, потому что каждый отправленный пакет кодируется в 10 битах на стороне Arduino (8 бит + стартовый и стоповый биты). Теоретически, время для чтения буфера со скоростью передачи данных, равной 9600, составляет buffer_size * 10/9600, что составляет 5,21 секунды, для buffer_size = 5000 выборок. Однако на практике время, измеренное с помощью «временного» модуля, гораздо больше: 6,58 секунды. Для buffer_size = 50000 теоретическая продолжительность равна ... 52,08 секунды, а измеренная продолжительность равна 53,34.

В чем причина этой разницы? Это постоянно? (не для небольших буферов)

Насколько я понимаю, невозможно выполнить какую-то "обработку" в реальном времени с помощью последовательной связи. Это асинхронный. Тем не менее, использование небольших буферов позволит большую гибкость. Например, пользователь может решить прекратить прослушивание порта и сохранить прочитанные данные.

Заранее благодарю за ответы и советы,

Код Arduino Uno:

#define analogPin A0
void setup() {Serial.begin(9600);}
void loop() {
int val = analogRead(analogPin);
byte bval = val >> 2;
Serial.write(bval);
}

Python код:

# # requires pySerial to be installed 
# conda install -c conda-forge pyserial
import serial
import time

# listen at Arduino port on Linux
# before running the Arduino part, you may need a "sudo chmod a+rw"
serial_port = '/dev/ttyACM0'
baud_rate = 9600  # In arduino, Serial.begin(baud_rate)

ser = serial.Serial(serial_port, baud_rate)

# buffer size = number of bytes to be read each time
buffer_size = 5000

print('listening to serial port: ' + serial_port)
tic = time.time()
line = ser.read(buffer_size)                
elapsedt = time.time()-tic
ser.close()
print('done!')
print('buffer size %d, number of read bytes %d' % (buffer_size, len(line)))

print('elapsed time: %.2f sec' % (time.time()-tic))

sample_rate = baud_rate/10  # 10 bits per packet, number of packets read each 1 second

print('theoretical elapsed time: %.2f sec, (buffer_size*10/baud_rate))' % (buffer_size/sample_rate))
...