uart1和uart2利用普通中断透传 (附带wifi esp8622的通信)

一、简介

	**芯片:stm32f051k8**           **软件平台:keil5, stm32CubeMX**       **方法:利用HAL固件实训中断在uart1中断通讯的基础上**
	**注意:时钟采用的默认时钟,uart1连接是PC ,uart2连接时esp8266**

二、实验步骤

1. 配置uart1和uart2都为异常中断通信(如下图uart1和uart2的配置相同)

在这里插入图片描述 在这里插入图片描述在这里插入图片描述

二、生成代码,在代码中添加

1、在main.c中

/*USER CODE BEGIN PV*/
//因为我这里是产生一个字节就产生中断
uint8_t RX_Buf_It1;             //中断字节
uint8_t Rx_Buf_It2;             //中断字节
/*USER CODE END PV*/



/* USER CODE BEGIN 0 */

//重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        //如果是uart1传出来的数据
        if(huart == &huart1)
        {
                //传送给uart2&
                HAL_UART_Transmit(&huart2,&RX_Buf_It1,1,HAL_MAX_DELAY);
                //初始化当前字节的内容
                memset(&RX_Buf_It1,0,sizeof(RX_Buf_It1));
                //重新使能一下中断
                HAL_UART_Receive_IT(&huart1,&RX_Buf_It1,1);
        }
        //如果是uart2传过来的数据
        if(huart == &huart2)
        {
                HAL_UART_Transmit(&huart1,&RX_Buf_It2,1,HAL_MAX_DELAY);

                memset(&RX_Buf_It1,0,sizeof(RX_Buf_It2));
                HAL_UART_Receive_IT(&huart2,&RX_Buf_It2,1);
        
        }
}
/*USER CODE END 0*/

//在主函数main里面添加
/* USER CODE BEGIN 2 */
        
        //使能中断
        HAL_UART_Receive_IT(&huart1,&RX_Buf_It1,1);
        HAL_UART_Receive_IT(&huart2,&RX_Buf_It2,1);

/*USER CODE END 2*/

三、附加esp8266模块的透传通信

char command_putc(char ch)
{
        HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
        
        return ch;
}

void command_puts(char *str)
{
        while(*str != 0)
        {
                command_putc(*str);
                str++;
        }
}

void wifi_init(void)
{
        char p[133];
        
        command_puts("AT+CWMODE=1\r\n");//设为station模式  就是一个客户端
        HAL_Delay(2000);
        command_puts("AT+CWDHCP_CUR=1,1\r\n");
        //AT+UART_CUR - 设置 UART 当前临时设置,不保存到 Flash
        HAL_Delay(2000);        
        command_puts("AT+CWJAP=\"hqyj1107\",\"hqyj1107\"\r\n");//连接wifi
        HAL_Delay(7000);
        command_puts("AT+CIFSR\r\n");//查询 ESP8266 设备的IP地址和MAC
        HAL_Delay(3000);
        command_puts("AT+PING=\"192.168.11.109\"\r\n");//ping 一下服务器
        HAL_Delay(3000);
        command_puts("AT+CIPSTART=\"TCP\",\"192.168.11.109\",8888\r\n");//连接TCP服务器
        HAL_Delay(300);
        command_puts("AT+CIPMODE=1\r\n");//使能透传模式
        HAL_Delay(300);
        command_puts("AT+CIPSEND\r\n"); //开始透传发送
        HAL_Delay(300);
        
        //下面是把wifi的tcp上加了一个消息头,使其伪装为http通信;
//       sprintf(p,"POST /post HTTP/1.1\r\nHOST: 192.168.11.102:8081\r\nAccept: */*\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length: 3\r\n\r\n123");//                sprintf(p,"POST /post HTTP/1.1\r\nHOST: 192.168.11.102:8081\r\nAccept: */*\r\nContent-Type:application/x-www-form-urlencoded\r\nContent-Length: 3\r\n\r\n123");
//        command_puts(p);

// +++ 退出透传;不需要\r\n

}

四、改善HAL库的数据传输缓慢

用HAL库调用对应中断回调,会有大量的判断和函数调用,所以优化为寄存器版本;当然用空闲中断加DMA也是可以,后面会更新!代码见下图

在这里插入图片描述
在这里插入图片描述

UART1中断跳转

	//这里是读取uart1获取 SR 寄存器标志位状态 看它是否为set
	if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE) == SET)
	{
	//串口状态寄存器的TXE标志位,TXE标志位标识发送数据寄存器(TDR寄存器)是否为空
		while((USART2->ISR & 0x40) == 0);
		//把uart1的数据传给uart2
		USART2->TDR = USART1->RDR;
	}

uart2中断跳转

if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE) == SET)
	{
		while((USART1->ISR & 0x40) == 0);
		USART1->TDR = USART2->RDR;
	}

注:本文仅由作者用于总结和记录学习的过程,未经允许请勿擅自转载。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值