stm32串口间通信

最近要写个串口间通信的程序,要求PC端输入消息到串口1,然后stm32内部把该消息通过串口2转发出去,串口2得到消息返回,则通过串口1打印在PC端。实际上总体效果就是要是连接了设备的串口2具有串口1的功能,以便观察设备返回的信息以作后续的处理。

使用的芯片是stm32l151,采用中断接收方式,把串口2所收到的消息全部打印出来。

一开始直接参考原子的程序以接收回车键判断接收一次数据结束,实际上这样做的话会导致丢失大量信息,因为信息中可能还含有回车键。于是,便采用100ms连续接收的方式判断一次数据是否接收完成。如果两个数据之间的时间间隔超过100ms,则可以认为这两个数据不属于同一条消息了。这种机制的实现方法可以有很多,可以用定时器,也可以用简单的延时程序。在这里我用的是延时程序。

至于中断程序,因为采用的是100ms连续接收的方法,所以在中断处理中就可以简单很多了,不用判断是否收到了0x0a,0x0d之类的符号,只需要把数据寄存器里的内容保存起来就可以了。

因为串口2接的是设备,希望保存所以设备返回的信息,所以需要采用这种方法,而串口1的中断两种处理方法都可以(回车键和100ms延时)

串口2中断处理如下:

void USART2_IRQHandler(void)
{

	char res;	    
	if(__HAL_USART_GET_FLAG(&UartHandle2, USART_FLAG_RXNE) != RESET)//½ÓÊÕµ½Êý¾Ý
	{	 	 
		res =(uint16_t)(USART2->DR & (uint16_t)0x01FF);	
		if(USART2_RX_STA<800)		//»¹¿ÉÒÔ½ÓÊÕÊý¾Ý
		{
			USART2_RX_BUF[USART2_RX_STA]=res;		//¼Ç¼½ÓÊÕµ½µÄÖµ	 
			USART2_RX_STA++;
		}
	}				
}


下面是判断接收完成的程序

int USART2_Scan(void)
{
		uint16_t ftemp=0,i;
		ftemp = USART2_RX_STA;
    if( ftemp != 0 )		
    {
			HAL_Delay( 100 );
			while ( ftemp != USART2_RX_STA )
      {
				ftemp = USART2_RX_STA;
				HAL_Delay( 100 );
			}
      for ( i = 0; i <= ftemp+1; i++ )
      {
				RX2_Buff[i] = USART2_RX_BUF[i];                  
      }
			USART2_RX_STA = 0;      /* ÖØÖÃÖ¸Õë */
			return 1;
		}	
		USART2_RX_STA=0;
		return 0;
}


稍微解释一下上面的程序,

USART2_RX_STA是串口2接收缓存区的指针,在中断中该指针会随着接收消息而不断往后移
首先用一个临时指针指向它,然后用一个100ms的延时,如果还没接收完成的话<pre name="code" class="cpp">USART2_RX_STA会继续往后指,而ftemp还是原来的值,所以就可以通过判断延时后的两者是否还相等来判断是否接收完成了,如果100ms过了两个指针还相等,那么毫无疑问接收已经完成了。
要再程序中调用串口2接收的内容,只需要判断这个函数的返回值即可。接收到的内容保存了在RX2_Buff数组里。

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32是意法半导体公司推出的一系列32位ARM Cortex-M微控制器产品线。这些微控制器具有丰富的外设和强大的计算能力,被广泛应用于各种嵌入式系统中。 在STM32中,串口通信是一种常见的通信方式,可以实现与其他设备或模块的数据传输。下面是一些关于STM32串口通信的基本信息: 1. STM32串口外设:STM32微控制器通常具有多个串口外设,比如USART(通用同步/异步收发器)、UART(通用异步收发器)和SPI(串行外设接口)等。这些外设可以通过引脚连接到外部设备或计算机,并通过串口协议进行数据传输。 2. 串口通信配置:在STM32中,需要配置串口的波特率、数据位、停止位、校验位等参数,以确保与其他设备或模块之间的通信兼容性。 3. 串口通信代码示例:下面是一个使用STM32HAL库进行串口通信的简单示例(以USART为例): ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART2_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART2_UART_Init(); char* message = "Hello, World!\r\n"; while (1) { HAL_UART_Transmit(&huart2, (uint8_t*)message, strlen(message), HAL_MAX_DELAY); HAL_Delay(1000); } } void SystemClock_Config(void) { // 系统时钟配置 } static void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { Error_Handler(); } } ``` 在上述示例中,通过USART2串口发送"Hello, World!"消息,并设置波特率为9600。 以上是关于STM32串口通信的基本介绍和一个简单的代码示例。如果你有更具体的问题或需求,请提供更多详细信息,以便我能够更好地帮助你。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值