stm32串口通信,收发字符串,并对其进行解析

串口以字符串接收和发送

将传输的数据转化为整数(正负)

stm32发送端

	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(); sprintf(data_str, "%-8.4f, %-8.4f, %-8.4f, %-8.4f\n", motor_position , sensor_position , motor_velocity , sensor_velocity );Usart_SendString(USART1, data_str);

stm32接收端

接收数据格式为:\t16900\r\n,其中第一位“\t”为帧头,第二位数据1为奇偶校验位,最后两位数据"\r\n"为帧尾,中间数据为实际传输数据,即“6900”。

void USART1_IRQHandler(void)                	//串口1中断服务程序{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART1);	//读取接收到的数据 0x2D,0x31,0x30,0x30,0x30,0x0D,0x0Aif((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(2);USART_RX_BUF[1] = USART_RX_BUF[1] - '0';if(USART_RX_BUF[0] == '\t'&& USART_RX_BUF[1] == check_flag ) // 判断帧头是否正确、判断奇偶校验位是否正确 || USART_RX_BUF[1] == check_flag{float value = 0;int16_t sign = 1;int a = 2;for (int i = a; i < (USART_RX_STA&0X3FFF); i++) {value = value * 10 + USART_RX_BUF[i] - '0';		}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);}					}		 }}} 
}

将传输的数据转化为浮点数(正负)

stm32发送端

	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(); sprintf(data_str, "%-8.4f, %-8.4f, %-8.4f, %-8.4f\n", motor_position , sensor_position , motor_velocity , sensor_velocity );Usart_SendString(USART1, data_str);

stm32接收端

接收数据格式为:\t11.0246\r\n,其中第一位“\t”为帧头,第二位数据1为奇偶校验位,最后两位数据"\r\n"为帧尾,中间数据为实际传输数据,即“1.0246”。

void USART1_IRQHandler(void)                	//串口1中断服务程序{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾){Res = USART_ReceiveData(USART1);	//读取接收到的数据 0x2D,0x31,0x30,0x30,0x30,0x0D,0x0Aif((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(2);USART_RX_BUF[1] = USART_RX_BUF[1] - '0'; // 串口接收的是ASCII码,将其与'0'作差,则获得相应的整数。if(USART_RX_BUF[0] == '\t'&& USART_RX_BUF[1] == check_flag ) // 判断帧头是否正确、判断奇偶校验位是否正确 || USART_RX_BUF[1] == check_flag{float value = 0;int16_t sign = 1;int a = 2;if(USART_RX_BUF[2] == '-'){sign = -1;a = 3;}for (int i = a; i < (USART_RX_STA&0X3FFF); i++) {if(USART_RX_BUF[i] != '.'){value = value * 10 + USART_RX_BUF[i] - '0';	value +=  (USART_RX_BUF[i] - '0') * pow(10, -(i - a));}else{a = a+ 1;}}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/18931.shtml

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

相关文章

深度剖析数据在内存中的存储

目录 数据类型介绍 类型的基本归类 整形家族: 浮点数家族: 构造类型: 指针类型 空类型: 整形在内存中的存储 原码、反码、补码 大小端介绍 什么大端小端: 为什么有大端和小端: 练习 浮点型在内存中的储存 一个例子 浮点数存储规则 数据类型介绍 前面我们…

SpringBoot实现多数据源,集成mybatis和JPA

前言&#xff1a; 使用2个数据库&#xff0c;数据库A&#xff1a;phm 数据库B&#xff1a;mcs 。 在项目中主要使用hibernate实现全自动ORM,但是在复杂的业务中&#xff0c;需要使用mybatis来实现业务需求。 一、入门 1、添加依赖 <!-- 整合mybatis --><dependen…

Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效)

Windows同时安装两个版本的JDK并随时切换&#xff0c;以JDK6和JDK8为例&#xff0c;并解决相关存在的问题&#xff08;亲测有效&#xff09; 1.下载不同版本JDK 这里给出JDK6和JDK的百度网盘地址&#xff0c;具体安装过程&#xff0c;傻瓜式安装即可。 链接&#xff1a;http…

【Linux】用户相关内容

如果命令ll 出现以上信息&#xff0c;UID为具体的数字&#xff0c;代表之前UID为502的用户被删除了。 更改目录或文件所属用户和所属组 在Linux中&#xff0c;创建一个文件时&#xff0c;该文件的拥有者都是创建该文件的用户。 更改所属用户 chown 用户名 文件名/目录名 更…

VisualStudioWindows下 远程调试

前置条件 1、调试方与被调试方&#xff0c;以下简称调试方为A&#xff0c;被调试方为B。A与B双方能相互ping通 2、B需要运行RemoteDebugger服务&#xff0c;该程序位于C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\Remote Debugger下。 我这里是安装…

基于总线加锁和缓存锁(CPU实现原子操作的两种方式)

总线锁 总线锁就是使用处理器提供的一个 LOCK&#xff03;信号&#xff0c;当一个处理器在总线上输出此信号时&#xff0c;其他处理器的请求将被阻塞住&#xff0c;那么该处理器可以独占共享内存。 CPU和内存之间的通信被锁&#xff01;&#xff01; 如果多个 处 理器同 时对 …

windows下的txt文档,传到ubuntu后,每行后面出现^M,怎么处理?

问题背景&#xff1a;windows下pycharm生成的txt文档&#xff0c;传到ubuntu后&#xff0c;每行后面出现^M 用vim打开显示 使用cat -A filename显示如下 参考https://www.lmlphp.com/user/16697/article/item/579325/给出的几种方法 方法一、dos2unix filename。服务器没装…

配置IPv6 over IPv4手动隧道示例

组网需求 如图1所示&#xff0c;两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接&#xff0c;客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下&#xff1a; 配置IPv4网络。配置接…

iptables防火墙、filter表控制、扩展匹配、使用iptables配置网络型防火墙、NAT原理、配置SNAT

day05 day05iptables防火墙filter表filter中的三条链环境准备iptables操作验证FORWARD链准备环境配置FORWARD链NAT配置SNAT iptables iptables有多种功能&#xff0c;每一种功能都用一张表来实现最常用的功能是防火墙和NAT从RHEL7开始&#xff0c;默认的防火墙为firewalld&a…

fiddler 手机抓包(含https) 完整流程

第一部分&#xff1a;下载并安装fiddler 一.使用任一浏览器搜索【fiddler下载安装】&#xff0c;并下载fiddler 安装包。 二.fiddler安装包下载成功后&#xff0c;将下载的fiddler压缩包解压到自定义文件夹【fiddler】或者解压到当前文件夹下&#xff0c;双击文件夹中的【fidd…

一起学算法(链表篇)

1.链表的概念 对于顺序存储的结构最大的缺点就是插入和排序的时候需要移动大量的元素&#xff0c;所以链表的出生由此而来 先上代码&#xff1a; // 链表 public class LinkedList<T extends Comparable> {// 结点类class Node {T ele; // 当前结点上的元素内容Node ne…

台式机/工控机通过网线共享笔记本电脑无线网络linux系统下 usb网卡的驱动安装

一、台式机/工控机通过网线共享笔记本电脑无线网络 1、 将台式机通过网线和笔记本连接。 2、 将笔记本的“本地连接”和“无线网络连接”的ipv4均设置为自动获取。 4.修改台式机的IP地址为如下&#xff08;对应笔记本信息&#xff09; IP地址为192.168.XXX.12 子网掩码为255.2…

flask

flask 介绍 # python 界的web框架 -Django&#xff1a;大而全&#xff0c;快速开发&#xff0c;公司内部项目 -Flask&#xff1a;小而精&#xff0c;不具备web开发好多功能&#xff0c;丰富的第三方插件 -FastApi&#xff1a;异步框架&#xff0c;主要为了做前后端…

接口/Web自动化测试如何做?框架如何搭建封装?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试怎么做…

区块链赋能新时代司法体系,中移链打造可信存证服务

近期&#xff0c;某百万级粉丝网红的法律维权之路引发社会关注。其在面对网络造谣行为时积极搜集证据&#xff0c;使用区块链技术将相关信息上链保全&#xff0c;然后将造谣者全部起诉&#xff0c;一系列操作被广大网友喻为是教科书式网络维权。 科技在发展&#xff0c;时代在…

Windows7+内网, 安装高版本nodejs,使用vite+vue3+typescript开发项目

前言&#xff1a;vite只支持高版本的nodejs&#xff0c;而高版本的nodejs只支持windows8及以上&#xff0c;且vite还对浏览器版本有兼容问题。以下均为vite官网截图 1、安装好低版本的nodejs win7系统建议安装13.及以下&#xff0c;我的是12.12.0这个版本。nodejs低版本官网下载…

JavaScript(四)DOM及CSS操作

1、DOM简介 DocumentType: Html的声明标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Docume…

网络:SecureCRT介绍

1. 使用Tab键补全时出现^I&#xff0c;如下操作

【万字长文】SpringBoot整合MyBatis搭建MySQL多数据源完整教程(提供Gitee源码)

前言&#xff1a;在我往期的博客介绍了2种关于如何使用SpringBoot搭建多数据源操作&#xff0c;本期博客我参考的是目前主流的框架&#xff0c;把最后一种整合多数据源的方式以博客的形式讲解完&#xff0c;整合的过程比较传统和复杂&#xff0c;不过我依旧会把每个实体类的思路…

利用鸿鹄可观测性监控Istio Ingress网关

一、需求描述 在上一篇《利用Vector和鸿鹄搭建微服务应用的可观测性平台》中&#xff0c;阐述了微服务的基本概念、优点及如何利用鸿鹄来处理分布式应用的日志。本文将进一步讨论微服务架构面临的问题、服务网格及鸿鹄处理Istio Gateway的独特优势。 1.1 微服务架构面临的挑战 …