继续上节的工程,我给电机做了一个简单的建模后,就需要具体实现每一个功能了。
首先我们要在脑海里建立好一个模型,我们一方面向串口输入数据,一方面还要从串口里接收数据。在刚开始的时候,我定义了很多个函数,在发送完数据后立马就接收驱动器回复的数据,在后期想用多线程的时候很容易产生错误,导致驱动器不知道我发送的是什么指令需要使用线程锁来编写,又导致程序非常的复杂。在参考网上的的串口多线程编程的过程中,我转变了思想,为什么不定义一个线程向驱动器写数据,另一个线程接收驱动器数据并解析数据呢?这样很大的提高了程序的性能。
#!/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)
通过不断的循环,从而不断的接收驱动器的数据。