使用皇冠新体育APP和pyserial库实现串口数据的发送和接收,与单片机通讯修改PID参数。
python pyserial msvcrt.getch() 实现用户键盘控制串口数据收发...
近几天在用并级PID有效控制倒立摆,用板子上的按建调整PID主要参数。图标按久了事实不温和,说用无线wifi串口与皇冠新体育APP通信设备保持手机键盘调参。下面不是我研发一堆早上的成绩,时期也踩了大多数坑,所写来让大伙儿少走点弯路。
1. 实现工具
软件:皇冠新体育APP3.9.5
库: pyserial msvcrt time
2.库安装
注意要安装pyserial,不要安装成serial。
如果已经有serial库需要卸载掉。
打开控制台,输入以下代码
pip install pyserial
msvcrt 和 time 库是皇冠新体育APP预装软件卸载的,不要手动挡布置
3. 避坑指南
1.msvcrt.getch() 该函数将键盘输入的单个字符转化为字节型返回。
所以进行判断时,要将字符转化为字节 b’ ’
if(mesg == b'q'):
2.串口仅能以字节的形态通信设备,全部仅能使用和推送字节型数据库(或字节串)
data = com.read() #接收字节型数据
print(data.decode('Ascii'),end='') #以字符型解码输出
com.write(b'q') #发送字节型数据
3.msvcrt.getch() 该函数只能在控制台运行,否则该函数只会返回 b’\xff’
4.皇冠新体育APP程序
import serial
import msvcrt
import time
#对键盘输入的字符进行判断,并使用串口发送出去
def send_mesg():
if(mesg == b'q'):
com.write(b'q')
elif(mesg == b'e'):
com.write(b'e')
elif(mesg == b'a'):
com.write(b'a')
elif(mesg == b'd'):
com.write(b'd')
elif(mesg == b'w'):
com.write(b'w')
elif(mesg == b's'):
com.write(b's')
elif(mesg == b' '):
com.write(b' ')
#接收串口收到的数据,并打印出来
def recv_data(): #com.in_waiting 如果接收缓冲区有数据返回1
if(com.in_waiting > 0): #这个判断是为了在每一次输出玩所有信息后进行一次换行
while(com.in_waiting > 0):
data = com.read() #该函数只能一次接受一个字节的信息,该循环持续到读取完所有信息
print(data.decode('Ascii'),end='') #将接受到的数据解码后打印出来
print()
#首先进行串口参数配置 分别是 端口 波特率 字节大小 读取超时限制 停止位
com = serial.Serial(port="COM9", baudrate=115200,
bytesize=8, timeout=1, stopbits=serial.STOPBITS_ONE)
#死循环,进行串口通讯
while(1):
mesg = msvcrt.getch() #获取键盘输入的单个字符
send_mesg()
time.sleep(0.1) #延时0.1秒,等待单片机接受信息并返回数据
recv_data()
5.单片机程序
void uart_ctrl()
{
if(uart_query(UART_2, &uart_buff))
{
switch(uart_buff)
{
case 'q': state_var--; break;
case 'e': state_var++; break;
case 'a': state_scale--; break;
case 'd': state_scale++; break;
case 's': flag_j=1; break;
case 'w': flag_k=1; break;
case ' ':
{
flag_balance = !flag_balance;
if(flag_balance==1) printf("open balance\n");
else printf("close balance\n");
break;
}
}
if(state_var == 6) state_var=1;
if(state_scale == 6) state_scale=1;
if(state_var == 0) state_var=5;
if(state_scale == 0) state_scale=5;
set_debug_var();
if(uart_buff=='q'||uart_buff=='e'||uart_buff=='w'||uart_buff=='s')
{
switch(state_var)
{
case 1: printf("balance_kp: %.2f\n",balance_kp); break;
case 2: printf("balance_kd: %.2f\n",balance_kd); break;
case 3: printf("velocity_kp: %.2f\n",velocity_kp); break;
case 4: printf("velocity_ki: %.2f\n",velocity_ki); break;
case 5: printf("target_angle: %.2f\n",target_angle); break;
}
}
if(uart_buff=='a'||uart_buff=='d')
{
switch(state_scale)
{
case 1: printf("0.01\n"); break;
case 2: printf("0.1 \n"); break;
case 3: printf("1 \n"); break;
case 4: printf("10 \n"); break;
case 5: printf("100 \n"); break;
}
}
}
}
void set_debug_var()
{
static float Scale;
switch(state_scale)
{
case 1: Scale = 0.01; ips200_showstr(130, 1, "0.01"); break;
case 2: Scale = 0.1; ips200_showstr(130, 1, "0.1 "); break;
case 3: Scale = 1; ips200_showstr(130, 1, "1 "); break;
case 4: Scale = 10; ips200_showstr(130, 1, "10 "); break;
case 5: Scale = 100; ips200_showstr(130, 1, "100 "); break;
}
switch(state_var)
{
case 1: change_debug_var(&balance_kp, Scale); ips200_showstr(120,0,"bal_kp"); ips200_showfloat(120,2,balance_kp,4,2); break;
case 2: change_debug_var(&balance_kd, Scale); ips200_showstr(120,0,"bal_kd"); ips200_showfloat(120,3,balance_kd,3,2); break;
case 3: change_debug_var(&velocity_kp, Scale); ips200_showstr(120,0,"vel_kp"); ips200_showfloat(120,4,velocity_kp,4,2); break;
case 4: change_debug_var(&velocity_ki, Scale); ips200_showstr(120,0,"vel_ki"); ips200_showfloat(120,5,velocity_ki,3,2); break;
case 5: change_debug_var(&target_angle, Scale); ips200_showstr(120,0,"tar_ag "); ips200_showfloat(120,6,target_angle,2,2); break;
}
}
void change_debug_var(float *var, float scale)
{
if(flag_sw2 || flag_k==1) *var += scale, flag_k=0;
if(flag_sw1 || flag_j==1) *var -= scale, flag_j=0;
}
6.效果展示
皇冠新体育APP相关的文章
- docker-compose volumes配置解析_Docker Compose部署及基础使用详解_苏二龙
- gateway转发security登录接口失败_SpringCloud学习笔记??新服务网关Gateway初识_lie zi
- ora-28500 ora-02063 mysql_[原创]ORACLE GATEWAY FOR SQLSERVER的错误_超颍
- java httpclick请求成功没有返回值_springcloud-请求合并(consumer)ribbon_观致
- springcloudgateway动态路由_Spring Cloud Gateway如何快速实现多版本灰度发布上线?-Part 7..._weixin_39862985
- springcloud配置负载均衡 及方式_Springcloud-Ribbon负载均衡NODO_九尾旅人
- springmvc无法解析视图前缀prefix_SpringBoot2.x系列教程之整合SpringMVC之内容协商视图解析器..._weixin_39890332
- springcloud gateway 鉴权_基于SpringCloud的微服务网关融合演进及实践_weixin_39837124
- springcloud gateway 跳转http_Spring Cloud:使用 Zuul 实现路由网关详解_weixin_39635084
- ARM 架构及汇编_听枫要靠谱_arm框架
- ios调用restful接口_可以由Web App(角度),iOS和Android使用的安全RESTful API_weixin_39743423
- gin context和官方context_1 Go语言 系列讲座:Gin+Jwt+casbin RestFul Api 后端一战到底_Choice林
- 皇冠新体育APP:python中如何判断两个字符串是否相等_python怎样判断两个字符串是否相同_段元朋
- Django3(二)异步编程_小炫y_django异步
- 皇冠新体育APP:java的没括号是什么_Java:没有方括号的Gson解析_rrhhc
- gin context和官方context_Go Web 小技巧(一)简化Gin接口代码_KAREN LOHAS