#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)