stm32与python端进行串口收发

1-1 串口发送端(stm32)

1字符串发送

/************状态:电机速度、位置和角位移传感器的速度、位置*****************/	 
//  字符串收发:已调试成功motor_position = Read_Encoder_Angle(Encoder);sensor_position = Get_Adc_Average_Angle(Adc);motor_velocity = Read_Encoder_Speed(Encoder);sensor_velocity = Get_Adc_Average_Speed();pc_fil = LPF(motor_position, pc_fil,0.2f);vc_fil = LPF(motor_velocity, vc_fil,0.2f);ec_fil = LPF(sensor_position,ec_fil,0.2f);wc_fil = LPF(sensor_velocity,wc_fil,0.2f);/************** 串口发送数据方式一:使用字符串传输数据(整型和浮点型) **********************/				 sprintf(data_str, "%-8.4f, %-8.4f, %-8.4f, %-8.4f\n", pc_fil, ec_fil, vc_fil, wc_fil);Usart_SendString(USART1, data_str);motor_velocity = 0.123;

2 16进制传输(整型)

/************** 串口发送数据方式二:传输数据打包-16进制传输(整型) **********************/		data_array[0] =  0x12;data_array[1] =  0x34;data_array[2] = (int)Encoder & 0xFF;data_array[3] = ((int)Encoder >> 8) & 0xFF;data_array[4] = (int)Adc & 0xFF;data_array[5] = ((int)Adc >> 8) & 0xFF;data_array[6] =  0x56;data_array[7] =  0x78;for(uint8_t  i = 0 ; i < 8; i++){USART_SendData(USART1, *(data_array + i));while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);  }

3 16进制传输(整型和浮点型)


/************** 串口发送数据方式三: 串口传输数据打包-16进制传输(整型和浮点型) **********************/		//函数功能:将一个浮点数转换为字节数组   倒序  大小端的问题
//入口参数:浮点数   字节数组
void FloatToByte(float floatNum, unsigned char* byteArry) {char* pchar = (char*)&floatNum;for (int i = 0; i < sizeof(float); i++) {*byteArry = *pchar;pchar++;byteArry++;}
}FloatToByte(motor_velocity, byteArry); // 8个字节数据data_array[0] =  0x12;  // 帧头1data_array[1] =  0x34;  // 帧头2data_array[2] = (int)motor_position & 0xFF;          // 电机位置低字节data_array[3] = ((int)motor_position >> 8) & 0xFF;   // 电机位置高字节/*电机速度为浮点型数据,将其十进制数转换为单精度浮点数是4个字节(32位),转换网站:http://www.styb.cn/cms/ieee_754.php*/data_array[4] = byteArry[0];							// 电机速度低字节		data_array[5] = byteArry[1];				// 电机速度高字节	data_array[6] = byteArry[2];							// 电机速度低字节		data_array[7] = byteArry[3];				// 电机速度高字节	data_array[8] =  0x56;  // 帧尾1data_array[9] =  0x78;  // 帧尾2for(uint8_t  i = 0 ; i < sizeof(data_array); i++){USART_SendData(USART1, *(data_array + i));while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);  }

4 仅发送浮点型小数

/**************串口发送数据方式四: 仅发送浮点型小数 **********************///函数功能:将一个浮点数转换为字节数组   倒序  大小端的问题
//入口参数:浮点数   字节数组
void FloatToByte(float floatNum, unsigned char* byteArry) {char* pchar = (char*)&floatNum;for (int i = 0; i < sizeof(float); i++) {*byteArry = *pchar;pchar++;byteArry++;}
}
FloatToByte(motor_velocity, byteArry); // 8个字节数据
for(uint8_t  i = 0 ; i < sizeof(float); i++)
{USART_SendData(USART1, *(byteArry + i));while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);  
}

1-2 串口接收端-python

接收数据:编码器(整型)、角位移传感器(整型)
# 从串口接收的数据为:编码器(整型)、角位移传感器(整型)
def read_serial_one_data_encoder_adc(ser):global receive_resultBUF_SIZE = 8buf = bytearray([0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x56, 0x78])c1 = ib = flag = 0while True:R = ser.read(1)# print("data", R)if R == b'':print("Read Fail")ser.close()breakc = int.from_bytes(R, byteorder='big')# print("data", c)if flag > 0:if ib < BUF_SIZE:buf[ib] = cib += 1if ib == 8:if buf[6] == 0x56 and buf[7] == 0x78:Encoder = (buf[3] << 8) + buf[2]Adc= (buf[5] << 8) + buf[4]receive_result = [Encoder, Adc]breakelse:print("CRC Fail")flag = 0if flag == 0:if c1 == 0x12 and c == 0x34:flag = 1ib = 2c1 = creturn receive_result
接收数据:编码器(整型)、角位移传感器(浮点型)
# 从串口接收的数据为:电机位置(整型)、电机速度(浮点型)
def read_serial_one_data_motor_position_velocity(ser):global receive_resultBUF_SIZE = 10buf = bytearray([0x12, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x78])c1 = c2 = ib = flag = 0while True:R = ser.read(1)# print("data", R)if R == b'':print("Read Fail")ser.close()breakc = int.from_bytes(R, byteorder='big')# print("data", c)if flag > 0:if ib < BUF_SIZE:buf[ib] = cib += 1if ib == 8:if buf[8] == 0x56 and buf[9] == 0x78:motor_position = (buf[3] << 8) + buf[2]# motor_veclocity = (buf[7] << 24) +(buf[6] << 16) +(buf[5] << 8) + buf[4]motor_veclocity = Byte2Float(buf[4:8])receive_result = [motor_position, motor_veclocity]breakelse:print("CRC Fail")flag = 0if flag == 0:if c1 == 0x12 and c == 0x34:flag = 1ib = 2c1 = creturn receive_result

2-1 串口发送端python

action = bytearray([0x12, 0x34, 0x00, 0x00, 0x00, 0x56, 0x78])
action_ = int(control_motor(result[0], result[1]))
print("action_", action_)
# 将action转化成字符串
action[0] = 0x2D   # 帧头
action[1] = 0x01   # 校验位,具体未实现,用0x01替代
if action_ < 0:action[2] = 0x45   # 符号位action[3] = action_  & 0xFF    # 数据位action[4] = (action_ >>8) & 0xFF  # 数据位action[5] = 0x0d   # 0x56是十六进制表示法,表示的是十进制数值86。而V是英文字母,它在ASCII码中的十进制表示是86。所以,0x56和V表示的是同一个字符。action[6] = 0x0a   # 0x78是十六进制表示法,表示的是十进制数值120。而x是英文字母,它在ASCII码中的十进制表示是120。所以,0x78和x表示的是同一个字符。for byte in action: # 一个一个字节发送 ,一次发送多个字节容易出错ser.write(byte.to_bytes(1, 'big'))

2-2 串口接收端stm32

void USART1_IRQHandler(void)                	//串口1中断服务程序{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART1);	//读取接收到的数据 0x2D,0x01,0x30,0x30,0x30,0x0D,0x0Aprintf("%02X", Res);if((USART_RX_STA&0x8000)==0)//接收未完成{if(USART_RX_STA&0x4000)//接收到了0x0D{if(Res!=0x0A){USART_RX_STA=0;//接收错误,重新开始memset(USART_RX_BUF,0,USART_REC_LEN);}else{USART_RX_STA|=0x8000;	//接收完成了//								check_flag = count_odd_numbers();
//								USART_RX_BUF[1] = USART_RX_BUF[1] - '0';if(USART_RX_BUF[0] == 0x2D && USART_RX_BUF[1] == 0x01 ) // 判断帧头是否正确、判断奇偶校验位是否正确 || USART_RX_BUF[1] == check_flag{float value = 0;int16_t sign = 1;if(USART_RX_BUF[2] == 0x45){sign = -1;}value = (USART_RX_BUF[4] << 8) + USART_RX_BUF[3];	action = sign * value;USART_RX_STA = 0;	memset(USART_RX_BUF,0,USART_REC_LEN);}else{USART_RX_STA = 0;	memset(USART_RX_BUF,0,USART_REC_LEN);}}								}else //还没收到0X0D{	if(Res==0x0D)USART_RX_STA|=0x4000;else{					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;USART_RX_STA++;if(USART_RX_STA>(USART_REC_LEN-1)){USART_RX_STA=0;//接收数据错误,重新开始接收memset(USART_RX_BUF,0,USART_REC_LEN);}					}		 }}} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607844.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

门店管理系统驱动智慧零售升级

在当今数字化经济的大潮中&#xff0c;实体门店正在经历一场由内而外的深度变革。门店管理系统以其高效、便捷和全面的功能特性&#xff0c;为实体店提供了高效的运营解决方案。 门店管理系统拜托了传统零售业对本地化软件的依赖&#xff0c;它将复杂的信息技术转化为易于获取…

2024十大开放式耳机品牌有哪些?公认好用的开放式耳机测评推荐

随着生活水平的提升&#xff0c;人们对音频设备的需求已经不再只是简单的声音输出&#xff0c;而是追求更高质量的听觉体验&#xff0c;而近几年出现的开放式耳机正是为了满足这一需求而诞生的&#xff0c;凭借着不入耳的设计带来了极致的佩戴体验&#xff0c;这种耳机也成为了…

如何克隆驱动器,不同的操作系统有不同的推荐软件

你需要将Windows或macOS安装迁移到新驱动器吗?你可以使用服务备份文件,也可以创建数据的完整一对一副本。通过克隆你的驱动器,你可以创建一个精确的副本。 一些业务级别的备份服务,如IDrive和Acronis,具有内置的磁盘克隆功能,是对正常文件备份的补充。但对于一次性克隆(…

SpringBoot+策略模式实现多种文件存储模式

一、策略模式 背景 针对某种业务可能存在多种实现方式&#xff1b;传统方式是通过传统if…else…或者switch代码判断&#xff1b; 弊端&#xff1a; 代码可读性差扩展性差难以维护 策略模式简介 策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行…

Python中的图像处理和计算机视觉应用

Python是一种广泛使用的编程语言&#xff0c;在图像处理和计算机视觉领域有广泛的应用。以下是一些Python中图像处理和计算机视觉的应用示例&#xff1a; 图像处理&#xff1a;Python有许多强大的图像处理库&#xff0c;如PIL&#xff08;Python Imaging Library&#xff09;和…

【python 100个常用关键字,解释他们如何使用。】

python 。实际上&#xff0c;Python 语言中只有少数几十个关键字。以下是 Python 3.9 中的关键字列表&#xff0c;并对其中一些关键字的简要解释&#xff1a; False - 表示布尔类型的假值。None - 表示一个空值或者不存在的值。True - 表示布尔类型的真值。and - 逻辑与操作符…

实现导航栏吸顶操作

一、使用VueUse插件 // 安装 npm i vueuse/core二、点击搜索useScroll 2.1搜索结果如图 三、使用 // 这是示例代码 import { useScroll } from vueuse/core const el ref<HTMLElement | null>(null) const { x, y, isScrolling, arrivedState, directions } useSc…

oracle数据库raw数据类型

Oracle 数据库中的 RAW 数据类型是一种用于存储原始二进制数据的数据类型。它可以存储任意字节的数据&#xff0c;并且不对数据进行任何解析或转换。RAW 数据类型非常适合存储图像、音频、视频和其他二进制文件。 以下是一些关于 RAW 数据类型的要点&#xff1a; 1. 存储空间…

结构型设计模式——适配器模式

适配器模式 这个更加好理解&#xff0c;就是做适配功能的类&#xff0c;例如&#xff0c;现在手机没有了圆形耳机接口&#xff0c;只有Type-C接口&#xff0c;因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器&#xff08;适配器&#xff09;&#xff0c;这…

【Java 设计模式】设计原则

文章目录 ✨单一职责原则&#xff08;SRP&#xff09;✨开放/封闭原则&#xff08;OCP&#xff09;✨里氏替换原则&#xff08;LSP&#xff09;✨依赖倒置原则&#xff08;DIP&#xff09;✨接口隔离原则&#xff08;ISP&#xff09;✨合成/聚合复用原则&#xff08;CARP&#…

深入理解云原生技术:构建现代化可靠的应用

引言 云原生技术作为软件开发和部署的新范式&#xff0c;以其高度可伸缩性、灵活性和可靠性&#xff0c;吸引了广泛的关注。本文将深入探讨云原生技术的核心概念、优势以及其在现代软件开发中的应用。 1. 什么是云原生技术&#xff1f; 云原生技术是一种以云计算为基础&#…

美国NDC药品码注册详细介绍(OTC药品FDA注册)

美国药品验证号&#xff08;NDC&#xff09;注册介绍 希望我发布的文章能帮助到刷到的有缘人 国家药品验证号&#xff08;NDC&#xff09;是中国中药及OTC非处方药通过FDA认证的快捷申请形式。主要针对美国国家药典已有的药&#xff0c;无需做新药论证&#xff0c;只需提供必…

【Py/Java/C++三种语言详解】LeetCode每日一题240109【动态规划】LeetCode2707题、字符串中的额外字符

文章目录 题目描述解题思路简单举例哈希集合进行查找动态规划三部曲 代码pythonjavacpp时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff…

百度Java面试

百度社招 一面 1、上来照例还是问了问项目&#xff1a; 答&#xff1a;我介绍了自己的项目背景&#xff0c;项目的整个流程&#xff0c;由于是一个多人合作的项目&#xff0c;还介绍了自己负责项目的哪个模块&#xff0c;以及这个模块如何实现的&#xff0c;我感觉我个人说话语…

How to view the high-tech zone atmospheric project

How to view the high-tech zone atmospheric project 当前现状登录界面没有验证码部分页面加载时间过长联动型下拉列表框点击反应迟钝页面缺乏导航没有采用https协议没有完成域名实名认证左侧菜单区不能收缩大屏区域功能图层不能完全隐藏部分页面表单控件没有文案提示其功能部…

揭秘阿里自研搜索引擎 Havenask 在线检索服务

作者&#xff1a;谷深 Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎&#xff0c;深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 的在线服务&#xff0c;它具备高可用、高时效、低成本的优势&#xff0c;…

Leetcode的AC指南 —— 字符串/KMP:28.找出字符串中第一个匹配项的下标

摘要&#xff1a; Leetcode的AC指南 —— 字符串/KMP&#xff1a;28.找出字符串中第一个匹配项的下标。题目介绍&#xff1a;给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#x…

前端angular 实现验证码 输入+展示(大框+加粗内容 )

参考用原生方在手机上此效果 如何实现一个4位验证码输入框效果 输入使用的任旧是html的input元素&#xff0c;只是让它看不到了只是把输入到input元素里的内容取到的内容放在改过样式的div里不需要dom操作&#xff0c;直接用双向绑定就拿到数据&#xff1b;使用动态样式 设置了…

sublime代码对齐设置

sublime代码对齐设置 sublime代码对齐设置待续、更新中 sublime代码对齐设置 Preferences->Key Bindings->user->编辑⽂档输⼊: { "keys": ["ctrlaltl"], "command": "reindent" }然后选中你要对齐的代码块或者ctrla全选代…