1. import rclpy
    2. from rclpy.node import Node
    3. import serial
    4. import struct
    5. import time
    6. import threading
    7. class MyNode(Node):
    8. def __init__(self,node_name):
    9. super().__init__(node_name)
    10. self.ser = serial.Serial("/dev/ttyS3",115200,timeout = 5)
    11. self.ser.flushInput()
    12. self.i = 0
    13. # 需要发送的头 类型和数据长度
    14. self.head = struct.pack('<b',0x7b)
    15. self.instruction = struct.pack('<b',0x00)
    16. self.length = struct.pack('<b',3)
    17. self.tail = struct.pack('<b',0x7a)
    18. self.t1 = threading.Thread(target=self.recv_speed)
    19. self.t2 = threading.Thread(target=self.send_speed,args=(-1.145,-4.786,9.295))
    20. self.t1.setDaemon(True)
    21. self.t1.setDaemon(True)
    22. self.t1.start()
    23. self.t2.start()
    24. def send_speed(self,x,y,z):
    25. while True:
    26. data = struct.pack('<f',x)+struct.pack('<f',y)+struct.pack('<f',z)
    27. check_num = 0x00+3+x+y+z
    28. check = struct.pack('<f',check_num)
    29. # 需要发送的数据
    30. data = self.head+self.instruction+self.length+data+check+self.tail
    31. # 发送串口数据
    32. self.ser.write(data)
    33. time.sleep(0.06)
    34. def recv_speed(self):
    35. print('start')
    36. print(f'is_open:{self.ser.is_open}')
    37. # while True:
    38. # print(f'i:{self.i}')
    39. # self.i += 1
    40. # time.sleep(0.06)
    41. while True:
    42. self.i += 1
    43. num = self.ser.inWaiting()
    44. # print(f'i:{self.i} start num:{num}')
    45. # num = self.ser.in_waiting()
    46. # if num<=0 or num != 48:
    47. # continue
    48. if num<=0 or num<48:
    49. continue
    50. if num>48:
    51. # 清除
    52. self.ser.read(num)
    53. continue
    54. print(f'num:{num}')
    55. data = self.ser.read(num)
    56. # 解析数据
    57. self.parse_speed(data)
    58. print('end')
    59. time.sleep(0.06)
    60. def parse_speed(self,data):
    61. # 帧头
    62. head = struct.unpack('<B',data[:1])[0]
    63. if head!=122:
    64. return
    65. # 命令
    66. ins = struct.unpack('<B',data[1:2])[0]
    67. if ins!=1:
    68. return
    69. # 数据长度
    70. length = struct.unpack('<B',data[2:3])[0]
    71. if length!=10:
    72. return
    73. # 数据
    74. want_data = struct.unpack('<ffffffffff',data[3:43])
    75. # 校验位
    76. check = struct.unpack('<f',data[43:47])[0]
    77. # 帧尾
    78. tail = struct.unpack('<B',data[47:])[0]
    79. # self.get_logger().info(f'i:{self.i},帧头:{head},命令:{ins},数据长度:{length},数据:{want_data},校验位:{check},帧尾:{tail}')
    80. print(f'i:{self.i},帧头:{head},命令:{ins},数据长度:{length},数据:{want_data},校验位:{check},帧尾:{tail}')
    81. print(f'i:{self.i} end')
    82. def main():
    83. # 初始化rclpy
    84. rclpy.init()
    85. # 参数:节点名称
    86. node = MyNode('serial_node')
    87. # 节点代码执行完之后需要销毁节点
    88. node.destroy_node()
    89. # 关闭rclpy
    90. rclpy.shutdown()
    91. if __name__ == '__main__':
    92. main()