基于STM32F103 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);
		}

	
}

  • 35
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值