import rclpyfrom rclpy.node import Nodeimport serial import structimport timeimport threadingclass MyNode(Node): def __init__(self,node_name): super().__init__(node_name) self.ser = serial.Serial("/dev/ttyS3",115200,timeout = 5) self.ser.flushInput() self.i = 0 # 需要发送的头 类型和数据长度 self.head = struct.pack('<b',0x7b) self.instruction = struct.pack('<b',0x00) self.length = struct.pack('<b',3) self.tail = struct.pack('<b',0x7a) self.t1 = threading.Thread(target=self.recv_speed) self.t2 = threading.Thread(target=self.send_speed,args=(-1.145,-4.786,9.295)) self.t1.setDaemon(True) self.t1.setDaemon(True) self.t1.start() self.t2.start() def send_speed(self,x,y,z): while True: data = struct.pack('<f',x)+struct.pack('<f',y)+struct.pack('<f',z) check_num = 0x00+3+x+y+z check = struct.pack('<f',check_num) # 需要发送的数据 data = self.head+self.instruction+self.length+data+check+self.tail # 发送串口数据 self.ser.write(data) time.sleep(0.06) def recv_speed(self): print('start') print(f'is_open:{self.ser.is_open}') # while True: # print(f'i:{self.i}') # self.i += 1 # time.sleep(0.06) while True: self.i += 1 num = self.ser.inWaiting() # print(f'i:{self.i} start num:{num}') # num = self.ser.in_waiting() # if num<=0 or num != 48: # continue if num<=0 or num<48: continue if num>48: # 清除 self.ser.read(num) continue print(f'num:{num}') data = self.ser.read(num) # 解析数据 self.parse_speed(data) print('end') time.sleep(0.06) def parse_speed(self,data): # 帧头 head = struct.unpack('<B',data[:1])[0] if head!=122: return # 命令 ins = struct.unpack('<B',data[1:2])[0] if ins!=1: return # 数据长度 length = struct.unpack('<B',data[2:3])[0] if length!=10: return # 数据 want_data = struct.unpack('<ffffffffff',data[3:43]) # 校验位 check = struct.unpack('<f',data[43:47])[0] # 帧尾 tail = struct.unpack('<B',data[47:])[0] # self.get_logger().info(f'i:{self.i},帧头:{head},命令:{ins},数据长度:{length},数据:{want_data},校验位:{check},帧尾:{tail}') print(f'i:{self.i},帧头:{head},命令:{ins},数据长度:{length},数据:{want_data},校验位:{check},帧尾:{tail}') print(f'i:{self.i} end')def main(): # 初始化rclpy rclpy.init() # 参数:节点名称 node = MyNode('serial_node') # 节点代码执行完之后需要销毁节点 node.destroy_node() # 关闭rclpy rclpy.shutdown()if __name__ == '__main__': main()