首页 > 其他分享 >基于STM32F103 HAL库 开发 串口通讯

基于STM32F103 HAL库 开发 串口通讯

时间:2024-06-20 14:32:47浏览次数:25  
标签:STM32F103 Cnt aRxBuffer Rx Last uart3 uart2 串口 HAL

目录

CubeMX配置

调试配置​

时钟配置

打开串口2的中断

配置串口2波特率等

代码

com.h

com.c


CubeMX配置

调试配置

时钟配置

打开串口2的中断

配置串口2波特率等

串口3同理就不展示了

代码

com.h

#ifndef __COM_H__
#define __COM_H__


typedef struct {
	char TxBuffer[256];
	char RxBuffer[256];
	char aRxBuffer;	
	char Last_aRxBuffer;
	char Last_Last_aRxBuffer;
	char Rx_Cnt ;		
	char Rx_Length ;
	char flag;
} UART;


extern UART uart2;
extern UART uart3;
void com_init();
void com_send();
void com_receive();

#endif

com.c

#include "com.h"
#include "usart.h"

UART uart2;
UART uart3;


//通信初始化,放在初始化里
void com_init(){
	
	
	uart2.flag=0;
	uart2.Rx_Cnt=0;
	uart2.Rx_Length=10;//根据串口通信的数据长度来定
	uart3.flag=0;
	uart3.Rx_Cnt=0;
	uart3.Rx_Length=6;//根据串口通信的数据长度来定
	HAL_UART_Receive_IT(&huart2, (uint8_t *)&(uart2.aRxBuffer), 1);
	HAL_UART_Receive_IT(&huart3, (uint8_t *)&(uart3.aRxBuffer), 1);
}

//发送,放在代码里循环执行,发送比解码多两位头帧255和254
void com_send(){
	TxBuffer[0]=255;
	TxBuffer[1]=254;

	TxBuffer[2]=(uint8_t)(encoder[0].speed_sum>>8);
	TxBuffer[3]=(uint8_t)encoder[0].speed_sum;


	TxBuffer[4]=(uint8_t)(encoder[1].speed_sum>>8);
	TxBuffer[5]=(uint8_t)encoder[1].speed_sum;

	TxBuffer[6]=(uint8_t)(encoder[2].speed_sum>>8);
	TxBuffer[7]=(uint8_t)encoder[2].speed_sum;
	HAL_UART_Transmit(&huart3, TxBuffer, 8, 10000);

	
	
}
//解码,放在代码里循环执行,这里只是演示,具体写法据情况而定
void com_receive(){
	

	encoder[0]=(((short)uart3.RxBuffer[0])<<8)+((short)uart3.RxBuffer[1]);
	encoder[1]=(((short)uart3.RxBuffer[2])<<8)+((short)uart3.RxBuffer[3]);
	encoder[2]=(((short)uart3.RxBuffer[4])<<8)+((short)uart3.RxBuffer[5]);

	
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
	
	
	if (huart->Instance == USART2)
		{
		if(uart2.Last_aRxBuffer==254&&uart2.Last_Last_aRxBuffer==255&&uart2.flag==0)
			{
			uart2.Rx_Cnt = 0;
			uart2.flag=1;
			}
		if(uart2.flag==1)
			{
			uart2.RxBuffer[uart2.Rx_Cnt]=uart2.aRxBuffer;
			uart2.Rx_Cnt++;
			}
		if(uart2.Rx_Cnt==uart2.Rx_Length)
			{
			uart2.flag=0;
			}
			uart2.Last_Last_aRxBuffer=uart2.Last_aRxBuffer;
			uart2.Last_aRxBuffer=uart2.aRxBuffer;
			HAL_UART_Receive_IT(&huart2, (uint8_t *)&(uart2.aRxBuffer), 1);
		}
		
		
	if (huart->Instance == USART3)
		{
		if(uart3.Last_aRxBuffer==254&&uart3.Last_Last_aRxBuffer==255&&uart3.flag==0)
			{
			uart3.Rx_Cnt = 0;
			uart3.flag=1;
			}
		if(uart3.flag==1)
			{
			uart3.RxBuffer[uart3.Rx_Cnt]=uart3.aRxBuffer;
			uart3.Rx_Cnt++;
			}
		if(uart3.Rx_Cnt==uart3.Rx_Length)
			{
			uart3.flag=0;
			}
			uart3.Last_Last_aRxBuffer=uart3.Last_aRxBuffer;
			uart3.Last_aRxBuffer=uart3.aRxBuffer;
			HAL_UART_Receive_IT(&huart3, (uint8_t *)&(uart3.aRxBuffer), 1);
		}

	
}

标签:STM32F103,Cnt,aRxBuffer,Rx,Last,uart3,uart2,串口,HAL
From: https://blog.csdn.net/w111155855/article/details/139806077

相关文章

  • 基于Halcon开发的类似VIDI的通用深度学习软件
    基于Halcon开发的类似康耐视VIDI的通用深度学习软件基于Halcon20.11+QT5.12+VS2017开发,目标检测,语义分割和图片分类都已经工具化并且可可根据项目需要任意配置,各个深度学习工具的标注,训练,数据集,图片集,模型参数,结果筛选等等都已完成,并已实际应用于工业外观检测项目。和康耐......
  • delphi:利用定时器读取串口返回数据
    定时器20毫秒运行一次,单字符读取,如果读取到就保存到全局变量receData中,否则就输出到文本框中,并重置receData。优点:单字符读取,解决了按长度读取的弊端,如果按长度读取,很多时候并不知道究竟要读取多长,有的时候能读取完整,有的时候只读取了部分。procedureTfrmLC.tmrReceDataTimer(S......
  • (11.3)iic串口读写EEPROM实验:程序设计
    一、实验任务二、架构框图其中:i2c驱动模块: bit_ctrl:0代表发送8位字节地址;1代表发送16位字节地址(本实验采用)i2c_addr[15:0]:16位字节地址,当bit_ctrl为0时只有低8位是有效的i2c_data_w[7:0]:向EEPROM写入的8位数据i2c_exec:拉高代表当前进行......
  • DSP技术及应用的综合项目:串口与按键控制直流电机运行及液晶屏显示状态 芯片是TMS320F2
    目录绪论串口与按键控制直流电机运行及液晶屏显示状态一、实验目的及要求二、实验原理三、实验软硬件环境四、实验过程(实验步骤、记录、数据、分析)五、测试/调试及实验结果分析六、实验结论与体会内容说明参考资料绪论随着科技的飞速发展,数字信号处理器(DSP)在现代......
  • STM学习记录(六)————串口的发送接收
    文章目录前言一、串口结构体及库函数二、实现串口发送(库函数)1.程序设计2.代码三.串口接收1.串口接收(普通)2.串口中断接收3.串口发送字符串函数4.串口实现printf(重定向)5.串口实现scanf(重定向)前言一个学习单片机的小白~有错误评论区或私信指出~一、串口结构体及......
  • Java 6.16 DeepClone and ShallowClone
    浅克隆:复制对象的引用地址,导致克隆对象和原始对象共享引用类型字段的实际对象。classPersonimplementsCloneable{Stringname;Addressaddress;publicPerson(Stringname,Addressaddress){this.name=name;this.address=add......
  • HAL库开发--I2C的配置方式和读写操作
    知不足而奋进望远山而前行目录知不足而奋进望远山而前行​编辑文章目录前言目标内容需求I2C功能配置I2C编码移植PCF8563驱动I2C读写实现总结前言在嵌入式系统开发中,I2C(Inter-IntegratedCircuit)总线是一种常见且重要的通信协议,用于连接多种外设和传感器,实现......
  • 上位机图像处理和嵌入式模块部署(h750 mcu和usb虚拟串口)
    【 声明:版权所有,欢迎转载,请勿用于商业用途。联系信箱:[email protected]】    对于mcuusb而言,大部分情况下,它和上位机之间的关系都是device的关系。一般usb,可以成成host和device。如果mcu是host,那么意味着它可以主动访问别的usb设备,比如u盘、相机之类的设备。如......
  • 51单片机有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。
    1、功能描述有开发板A和开发板B,通过串口,实现开发板A的按键,控制开发板B的LED亮灭。2、实验原理1.串口通信(UART)串口通信是一种异步通信方式,它允许单片机通过两条线(发送线TX和接收线RX)进行数据传输。在51单片机中,串口通信是通过两个主要寄存器(SCON、SMO/SM1)和中断(RI、TI)......
  • GPIO介绍+点灯(寄存器+HAL库)
    1.GPIO概述GPIO(General-purposeinput/output):通用型输入输出。简单理解就是我们可以控制输入输出的STM32引脚,统称为GPIO。GPIO存在的意义就是用程序控制或读取他们的输出或输入。1.1.GPIO总体说明STM32有多组GPIO,比如我们使用的芯片:STM32F103ZET6共有7组GPIO端口,他们......