使用python,通过串口ROS直接控制电机驱动器(4)

继续上节的工程,我给电机做了一个简单的建模后,就需要具体实现每一个功能了。

首先我们要在脑海里建立好一个模型,我们一方面向串口输入数据,一方面还要从串口里接收数据。在刚开始的时候,我定义了很多个函数,在发送完数据后立马就接收驱动器回复的数据,在后期想用多线程的时候很容易产生错误,导致驱动器不知道我发送的是什么指令需要使用线程锁来编写,又导致程序非常的复杂。在参考网上的的串口多线程编程的过程中,我转变了思想,为什么不定义一个线程向驱动器写数据,另一个线程接收驱动器数据并解析数据呢?这样很大的提高了程序的性能。

#!/usr/bin/env python

import serial
import time
import threading

motor_speed_mode = b'\x02\x00\xC4\xC6'
motor_status = b'\x80\x00\x80'
motor_start = b'\x00\x00\x01\x01'


class SpeedMotor:
    def __init__(self, device, acc, dcc):
        # 真实速度
        self.rel_speed = 0
        # 设置的速度
        self.set_speed = 0
        # 运行状态
        self.run = False
        # 故障状态
        self.fault = None
        # 电机电压
        self.voltage = 0
        # 电机电流
        self.current = 0
        # 设置串口通讯
        self.serial = serial.Serial(device, 57600)
        self.serial.timeout = 0
        # 开启读数据线程
        threads = []
        t1 = threading.Thread(target=self.read_motor)
        threads.append(t1)
        for t in threads:
            t.start()

通过初始函数的过程,定义一个读线程。

下面是读取线程的代码:

    def read_motor(self):
        while True:
            n = self.serial.inWaiting()  # 等待数据的到来,并得到数据的长度
            if n:   # 如果有数据
                n = self.serial.read(n)  # 读取n位数据
                s = [hex(x) for x in bytes(n)]
                for i in range(len(s)):
                    s[i] = int(s[i], 16)
                print(s)

通过不断的循环,从而不断的接收驱动器的数据。

猜你喜欢

转载自blog.csdn.net/zengqz123/article/details/86088418