核心点 received_msg = self.bus.recv() 不能在同一个线程中发送完can数据帧后,再立即接收数据,需要在线程中接收,才不会有较大的接收延时
os.system('echo 123456 | sudo -S ip link set can0 type can bitrate 500000')
os.system('echo 123456 | sudo -S ifconfig can0 up')
class CanCommunication(object):
def __init__(self):
self.bus = can.interface.Bus(channel='can0', bustype='socketcan', bitrate=500000)
self.__control_thread = threading.Thread(target=self.__receive_messages)
self.__control_thread.setDaemon(True)
self.__control_thread.start()
def __receive_messages(self):
while True:
received_msg = self.bus.recv() # receive message
if received_msg is not None:
#print("get:%s "%(datetime.datetime.now()), received_msg.data)
self.__getMotorSpeed(received_msg)
def vel_control(self):
global l_speed_data, check_speed_data
try:
self.__send_data(01, l_speed_data)
self.__send_data(01, check_speed_data)
time.sleep(0.02)
except Exception as e:
print("An error occurred: ", e)
if __name__ == "__main__":
com = CanCommunication()
while True:
com.vel_control()
time.sleep(0.02)