目录
1 背景
为了能更好的用户体验,操作更方便。运用python实现相应的功能。
2 实例
2.1 输入脉冲数控制旋转角度
实现:
import time
from mcush import *
STEP = 1600 # 根据控制器组合开关设置
# 以下三个控制引脚共阴输入
ENABLE = '0.0' # 允许
DIR = '0.1' # 方向
PULSE = '0.2' # 脉冲
s = Mcush.Mcush(‘/dev/ttyACM0’)
s.pinOutputLow( [ENABLE, DIR, PULSE] ) # 同时控制3个引脚输出低电平
s.pulseInit( pin=PULSE, delay_us=50 ) # 初始化PULSE引脚
direction = True
try:
s.pinClr( ENABLE )
while True:
# 准备方向信号
print( "Direction: %d"% (int(direction)) )
if direction:
s.pinSet( DIR )
else:
s.pinClr( DIR )
# 旋转一圈
s.pulse( STEP ) # 产生STEP个脉冲
time.sleep(1)
# 反转方向
direction = not direction
finally:
s.pinSet( ENABLE ) # 按Ctrl-C中止后,恢复该控制引脚
2.2 RS485型传感器通讯
import serial
import time
CO = "04 03 00 02 00 01 25 9F" # 一氧化碳传感器问询帧
smoke = "03 03 00 03 00 01 75 E8" # 烟雾传感器问询帧
#CO = "home1" # 一氧化碳传感器问询帧
temp_GS = 1 # 报警标志 1 正常 0 报警
ser = serial.Serial("COM5", 9600) # 选择串口,设置波特率
def read_data(temp):
global temp_GS
if ser.is_open:
print("port open success")
# hex(16进制)转换为bytes(2进制),应注意python3.7与python2.7此处转换不同
if temp:
send_data = bytes.fromhex(CO) # 发送数据转换为b'\xff\xff\xff\xff\xff'
else:
send_data = bytes.fromhex(smoke)
ser.write(send_data) # 发送数据
time.sleep(0.1) # 延时,否则len_return_data将返回0
len_return_data = ser.inWaiting() # 将获取缓冲数据(接收数据)长度
# print(len_return_data)
if len_return_data:
return_data = ser.read(len_return_data) # 读取缓冲数据
# bytes(2进制)转换为hex(16进制),应注意python3.7与python2.7此处转换不同
str_return_data = str(return_data.hex())
# print(str_return_data)
if temp:
print("当前CO浓度为:", end="")
print(int(str_return_data[6:10], 16) / 10, end="") # 16进制转为整形 CO值
print("ppm")
if int(str_return_data[6:10], 16) > 50000:
print("当前CO浓度过高!")
temp_GS = 0
else:
print("当前烟雾状态:", end="")
if int(str_return_data[6:10],16) /10: # 16进制转为整形
print("警告")
print("起烟了!")
temp_GS = 0
else:
print("正常")
else:
print("port open failed")
def main():
read_data(1)
time.sleep(0.5)
read_data(0)
time.sleep(0.5)
if __name__ == "__main__":
# global temp_GS
while temp_GS:
main()
运行结果:
C:\Users\Administrator\Python\Python38\python.exe
port open success
当前烟雾状态:警告
起烟了!
2.3 通过串口控制电机
背景:通过python实现通过串口发送命令来控制电机x、y和z轴
import serial
def motor_init():
ser =serial.Serial();
ser.port ="COM5";
ser.baudrate =9600
ser.bytesize = serial.EIGHTBITS
ser.stopbits = serial.STOPBITS_ONE
ser.timeout =.1
ser.xonxoff = False
ser.rtscts = False
ser.dsrdtr = False
ser.writeTimeout = 0
return ser
def send(ser,command):
ser.write((command +'\r').encode())
if __name__ == "__main__":
ser = motor_init()
ser.open()
print("port open success")
send(ser,'xxxxx') # 实现x轴回零
3 常见问题:
问题1:提示ModuleNotFoundError: No module named ‘encodings’
Fatal Python error: init_fs_encoding: failed to get the Python codec of the filesystem encoding
Python runtime state: core initialized
ModuleNotFoundError: No module named 'encodings'
导致原因:
排查发现是安装python的版本过多,里边有安装python3.8,还有Conda自带的python。
解决方法:
卸载Conda,重新运行python,正常。
问题2:ModuleNotFoundError: No module named ‘pyserial’
解决方法:
方式一:直接安装pyserial
方式二 :排查环境配置是否正确
问题3:ValueError: invalid literal for int() with base 10: ‘4e47’
解决方法:
if int(str_return_data[6:10])
修改成:
if int(str_return_data[6:10],16) /10