a bytes-like object is required, not 'str' 오류 질문있습니다.

조회수 1681회
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style
from matplotlib.colors import BoundaryNorm
from matplotlib.ticker import MaxNLocator
import numpy as np
import serial #Import Serial Library

import time
from time import sleep

arduinoSerialData = serial.Serial('COM6',115200) #Create Serial port object called arduinoSerialData
size_of_the_matrix = 5

x, y = np.meshgrid(np.linspace(0,5,6), np.linspace(0,5,6)) #each axis is from 0 to 3 devided in 4 sections

distances_matrix = np.zeros((size_of_the_matrix,size_of_the_matrix))

fig = plt.figure(figsize=None,facecolor='white')

ax2 = plt.subplot()
quad1 = ax2.pcolormesh(x,y,distances_matrix,vmin=0,vmax=3000,shading='flat')
bar = fig.colorbar(quad1, ax=ax2)
bar.set_label("Ranges in each ROI (mm)")
ax2.set_xlabel('X')
ax2.set_ylabel('Y')

def init():
    quad1.set_array([])
    return quad1

def animate(iter):
    global distances_matrix
    if (arduinoSerialData.inWaiting()>0): #Check if data is on the serial port
        data_receving_from_arduino_as_string= arduinoSerialData.readline()
        distances_in_string = data_receving_from_arduino_as_string.split(',') #Convering the data                                     received from the arduino from string to a float
        distances_in_string.pop()
        distances = [float(i) for i in distances_in_string]

        if(len(distances)==size_of_the_matrix*size_of_the_matrix):         
          distances_matrix = np.reshape(distances, (size_of_the_matrix, size_of_the_matrix))

          b = distances_matrix[:,0:1]
          #print b
          a = distances_matrix [:,1:5]
          #print a
          c = np.concatenate((a,b), axis =1) 

          distances_matrix = np.flipud(c)
          #distances_matrix = c

    #print distances_matrix
    quad1.set_array(distances_matrix.ravel())

anim = animation.FuncAnimation(fig,animate ,interval=100,blit=False,repeat=False)
plt.show()

이코드에서 제목과같은 오류가 발생해 distances = [float(i) for i in distances_in_string] 부분을 distances = [float(i.decode()) for i in distances_in_string] 와같은 방식으로 바꿔봐도 해결이 되지않습니다. 어디가 잘못된걸까요?

에러메세지 전문은 아래와 같습니다!

PS C:\Users\hjj96> & python "c:/Users/hjj96/Desktop/Lidar-using-VL53L1X-            master/Files_for_demo/Files for demo/Read_and_plot_2d_map.py"
   Traceback (most recent call last):
  File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\backend_bases.py", line 1216, in             _on_timer
       ret = func(*args, **kwargs)
  File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1477, in _step
        still_going = super()._step(*args)
  File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1189, in _step
    self._dra    w_next_frame(framedata, self._blit)
  File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1208, in     _draw_next_frame
    self._draw_frame(framedata)
  File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1776, in     _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "c:/Users/hjj96/Desktop/Lidar-using-VL53L1X-master/Files_for_demo/Files for     demo/Read_and_plot_2d_map.py", line 44, in animate
    distances_in_string = data_receving_from_arduino_as_string.split(',') #Convering the data     received from the arduino from string to a float
TypeError: a bytes-like object is required, not 'str'
  • 에러 메시지도 전문을 올려주세요 초보자 2021.4.10 16:22
  • PS C:\Users\hjj96> & python "c:/Users/hjj96/Desktop/Lidar-using-VL53L1X-master/Files_for_demo/Files for demo/Read_and_plot_2d_map.py" Traceback (most recent call last): File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\backend_bases.py", line 1216, in _on_timer ret = func(*args, **kwargs) File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1477, in _step still_going = super()._step(*args) File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1189, in _step self._draw_next_frame(framedata, self._blit) File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1208, in _draw_next_frame self._draw_frame(framedata) File "C:\Users\hjj96\anaconda3\lib\site-packages\matplotlib\animation.py", line 1776, in _draw_frame self._drawn_artists = self._func(framedata, *self._args) File "c:/Users/hjj96/Desktop/Lidar-using-VL53L1X-master/Files_for_demo/Files for demo/Read_and_plot_2d_map.py", line 44, in animate distances_in_string = data_receving_from_arduino_as_string.split(',') #Convering the data received from the arduino from string to a float TypeError: a bytes-like object is required, not 'str' 한장희 2021.4.10 16:29
  • 입니다! 한장희 2021.4.10 16:29
  • 본문에 넣어주세요. 댓글로는 보기 불편합니다.. 초보자 2021.4.10 16:30
  • 죄송합니다 본문에 수정하여 올렸습니다! 한장희 2021.4.10 16:31
  • 파이썬 버전 차이로 인한 에러라는데.. data_receving_from_arduino_as_string.split(',')를 data_receving_from_arduino_as_string.split(',').encode()이나 data_receving_from_arduino_as_string.encode().split(',')로 수정하면 되는 거 같습니다. 초보자 2021.4.10 16:36

1 답변

  • data_receving_from_arduino_as_string.split(',') 에서 a bytes-like object is required, not 'str' 이 발생했다면, data_receving_from_arduino_as_string 가 스트링이 아니라 byte-array 이라는 말 같아요.

    >>> s = b'abcde'
    >>> s.split('c')
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        s.split('c')
    TypeError: a bytes-like object is required, not 'str'
    

    이렇게 같은 에러를 재현할 수 있습니다.

    이걸 고치려면, 바이트어레이를 스트링(',')으로 쪼개려다가 에러가 발생한 것이기 때문에, 그냥 b','로 쪼개보면 에러가 발생하지 않을 겁니다.

    >>> s = b'abcde'
    >>> s.split('c')
    Traceback (most recent call last):
      File "<pyshell#1>", line 1, in <module>
        s.split('c')
    TypeError: a bytes-like object is required, not 'str'
    >>> s.split(b'c')
    [b'ab', b'de']
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)