基于中断/DMA方式的串口通信

一,串口协议和RS-232标准:
串口协议:
串口通信是一种通过串行数据传输的方式进行的通信。它使用一对引脚进行单向或双向的数据传输。
RS-232标准:
RS-232标准是一种广泛用于串行通信的标准,定义了连接设备之间串行通信时的电气特性、信号极性、机械接口等。RS-232标准规定了常见的串口参数,如波特率、数据位、停止位和奇偶校验等。
RS232电平与TTL电平的区别:
RS232电平通常采用负逻辑,即高电平表示逻辑0,低电平表示逻辑1。而TTL电平通常是正逻辑,高电平表示逻辑。
“USB/TTL转232"模块(以CH340芯片模块为例)的工作原理:
CH340芯片:
CH340是一款USB转串口的芯片,常用于制作USB转TTL(UART)的模块。
DMA串口通信则是一种不需要CPU参与传输的数据传输方式。DMA(Direct Memory Access)是一种特殊的硬件设备,它能够直接访问系统内存而不需要通过 CPU。在DMA串口通信中,串口控制器和DMA控制器之间直接进行数据的传输,而不需要CPU的干预。通过配置DMA控制器,将相关传输的参数设置好,DMA控制器会独立地完成数据的传输并通知 CPU 传输完成,这样可以实现高速、低延迟的数据传输。
二,利用中断模式实现
1利用STM32CubeMX建立一个中断工程
首先打开STM32CubeMX
在这里插入图片描述

然后在新弹出的界面中搜索STM32F103C8,点击对应芯片:
在这里插入图片描述

在接下来选择GPIO,打开GPIOA1和GPIOA2两个端口:
在这里插入图片描述

然后开启USART1串口,设置为异步通信:
在这里插入图片描述

然后点击“project manager”,选择”project“:
在这里插入图片描述

然后点击”code generator“,选择以下选项:
在这里插入图片描述

点击"GENERATE CODE",生成如下工程:
在这里插入图片描述

函数编写思路:
编写一个字符串比较函数,将输入的数据字符串逐个与起始字符相比较,通过比较函数的返回值控制标志位,然后利用标志位的值不断改变而去控制字符串的发送。
函数主体编写过程:
我们在主函数里把GPIO口初始化设置成SET。

在main.c中编写字符串比较函数


int stringcompare(char str1[6],char str2[6])
	{
   
		uint8_t i=0;
	
		for(i = 0 ; i < 6 ; i++)
		{
   
		if (str1[i] != str2[i]) 
			
			return 0;//如果输入数据与原有数据不符,返回0
	}
	
	return 1;//如果位数全部相同,则返回1
}



定义初始字符串以及标志位,并编写主函数如下:

char start[6] = "start";
uint8_t flag=3;
 
int main(void)
{
   
  	HAL_Init();
  	SystemClock_Config();
  	MX_GPIO_Init();
  	MX_USART1_UART_Init();
	  uint8_t hello[20]="Hello,Windows!\r\n";
    uint8_t stop[50]="Stop!please enter 'start' to continue!\r\n";
	  HAL_UART_Receive_IT(&huart1,(uint8_t*)start,5);
	
  	while (1)
  	{
   
		
		 if(flag==1)//标志位为1,发送hellowindows
		{
   					
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
		   
		    HAL_UART_Transmit_IT(&huart1,hello,20);
		    HAL_Delay(1000);
		}
		else if(flag==0)//标志位为0,停止发送0.
		{
   
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
			 HAL_UART_Transmit_IT(&huart1,stop,50);
			flag=3;
		}
	
  }
}

随后,在主函数后添加中断控制函数:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值