Как я могу считывать значения из буфера с помощью Numpy, когда некоторые байты дополнены?

#python #numpy #pyserial

#python #numpy #pyserial

Вопрос:

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

 b'x00x009x00Ax002x00x00x18x00x13x00x11x00x10x00x10x00x10x00x10x00x10x00x11'
 

Я использовал numpy для преобразования буферов в массивы, которые я могу перебирать.

 byteVec = np.frombuffer(byteBuffer, dtype = 'uint8')
 

Но выполнение этого в примере приводит к следующему массиву:

 [95 0 0 57 0 65 0 50 0 0 24 0 19 0 17 0 16 0 16 0 16 0 16 0 17]
 

Как вы можете видеть, большая часть данных считывается правильно, за исключением значений, которые идут с дополнительным нулем слева, например x009, x00A или x002. Я не знаю причины, по которой некоторые значения считываются таким образом, в первую очередь, поскольку порт pyserial запрограммирован на прием только последовательностей из 8 бит, есть ли у меня способ прочитать эти байты с дополненными битами, используя numpy? или проблема связана с показаниями последовательного порта?

Заранее спасибо.

Ответ №1:

Это не «дополненные» байты. x009 это два байта — байт со значением 0 и байт со значением 57, который соответствует коду ASCII для 9 символа. Большинство байтов, которые соответствуют печатаемым значениям ASCII, отображаются как соответствующие символы ASCII в repr байтовой строке.

np.frombuffer делает именно то, что вы хотите. ( 95 В выводе, который вы отобразили, есть загадочное дополнение, но это либо ошибка, которую вы ввели при составлении своего вопроса, либо результат несвязанной ошибки, которую вы нам не показали.)

Комментарии:

1. Это, вероятно, более полезно и лучше объяснено, чем мой ответ 👍 Я не думал так излагать это.

Ответ №2:

Для меня это выглядит правильно:

 byteBuffer = b'x00x009x00Ax002x00x00x18x00x13x00x11x00x10x00x10x00x10x00x10x00x10x00x11'

np.frombuffer(byteBuffer, dtype = 'uint8')
 

Вывод

 array([ 0,  0, 57,  0, 65,  0, 50,  0,  0, 24,  0, 19,  0, 17,  0, 16,  0,
   16,  0, 16,  0, 16,  0, 16,  0, 17], dtype=uint8)