import rclpy
from rclpy.node import Node
import serial
import struct
import time
import threading
class 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()