浅谈STM32串口通信(二)自定义帧格式和超时接收

1 自定义帧格式

1.1 数据帧结构

定义一帧数据的结构

strcut FRAME
{
	u8 head;//帧头
	u8 len;//数据长度
	u8 type;//数据包类型,例如 1代表成绩,2代表身高……
	u8 data[16];//数据包缓冲区
};
1.2 填充数据帧

接下来,假设我要发一个数据包。例如发五个学生的成绩(假设成绩在buf[5]数组里), 那么需要定义一个数据帧变量score,并初始化:

strcut FRAME score;
score.head='#'; 
score.len=5; 
score.type=0x01; 
for(i=0;i<score.len,i++)
{
	score.data[i]=buf[i];
}
1.3 填充数发送缓冲区

然后,把这帧数据放到发送缓冲区:

u8 send_buf[18]={0},index=0,i;
send_buf[index++]=score.head;
send_buf[index++]=score.len;
send_buf[index++]=score.type;
for(i=0;i<score.len,i++)
{
	send_buf[index++]=score.data[i];
}
1.4 通过串口发送数据

最后,将缓冲区数据发送出去

for(i=0;i<score.len+3;i++)
{
	while((USART1->SR&0X40)==0);
	USART1->DR = send_buf[i];
}

2 超时接收

超时接收,就是接收过程可以不对数据进行任何处理。在接收到第一个数据时,就打开定时器开始计时,当定时器溢出后(例如设为10ms, 只要保证数据能传输完即可),认为数据接收结束,才开始处理数据。当然,不用定时器,使用空闲中断也可以,没用过所以这里不写。

2.1 串口中断服务程序
void USART1_IRQHandler(void)                	//´®¿Ú1ÖжϷþÎñ³ÌÐò
{
	u8 Res;	
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) 
	{
		if(0==over_flag)//未超时或者数据未处理
		{
			Res =USART_ReceiveData(USART1);	
		    ReceiveBuf[index++]=Res;
		    //当然,还要判断index的值是否过大,这里不做判断
		    if(0==time_flag)
		    {
				TIM_Cmd(TIM3, ENABLE); //接收到第一个字节,开启定时器
				time_flag=1;//定时器开启的标志
			}
		}
	}
}
2.2 定时器中断服务函数:
void TIM3_IRQHandler(void)
{ 		    		  			    
	if(TIM3->SR&0X0001)
	{
		over_flag=1;//超时标志置1   				   				     	    	
	}				   
	TIM3->SR&=~(1<<0);   
}
2.3 数据处理

业务程序大致这样:

if(over_flag) //超时,且数据未被处理
{
	{
		//对ReceiveBuf缓冲区的数据进行处理
		//首先要做判断,判断第一个字节是不是‘#’(还有其他检验数据的正确性的方法,
		//本文没涉及),如果数据有误,就丢弃
	}
	TIM_Cmd(TIM3, DISABLE);//关定时器
	time_flag=0//定时器标志置零
	over_flag=0; //超时标志清零,也表示数据已经被处理
}

大概就是上面写的这样啦,理解不到位还请见谅。临时写的,没有源代码……估计存在不少问题,仅供参考思路。谢谢!

  • 9
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,我可以回答这个问题。ESP32和STM32之间进行串口通信的协议可以选择常见的UART协议,也可以使用其他协议,例如SPI、I2C等。在使用UART协议时,需要确定波特率、数据位、停止位和校验位等参数,以确保数据的正确传输。同时,还需要确定数据的格式和命令的解析方式,以便双方能够正确地解析和处理数据。 ### 回答2: ESP32和STM32之间进行串口通信时,可以使用简单的协议来确保数据的可靠传输。下面是一个基本的串口通信协议示例: 1.格式由起始标识符、有效负载、校验和和结束标识符组成。起始标识符和结束标识符可以是一个特定的字节,例如0xAA和0xBB,用于标识开始和结束。有效负载是传输的数据。校验和是有效负载中每个字节的异或和。 2.数据传输: 以ESP32作为发送方,STM32作为接收方为例。ESP32将数据按照格式进行封装,并通过串口发送。STM32接收并解析ESP32发送的数据。 3.数据解析: STM32接收到数据后,首先进行格式的验证,确认起始标识符和结束标识符的正确性。然后,计算有效负载的校验和,并与接收到的校验和进行比较,以验证数据的完整性。如果校验和不匹配,则丢弃数据。如果通过验证,解析有效负载的数据,进行相应的处理。 4.应答机制: 发送方可以加入应答机制,确保数据的可靠传输。发送方在发送数据后等待接收方的应答信号。接收方收到数据后,根据数据的处理结果发送应答信号给发送方。发送方根据应答信号,决定是否重新发送数据。 5.错误处理: 如果在通信过程中发生错误,可以定义一些特殊的错误码或协议规定的方式来处理错误。例如,可以定义特定的错误码表示通信超时、校验和错误等。 以上是一个简单的ESP32和STM32之间进行串口通信的基本协议示例。具体协议的设计和实现还需要根据实际需求和场景进行优化和扩展。 ### 回答3: ESP32和STM32作为两种不同的芯片,它们之间进行串口通信可以采用一种简单的协议来实现。下面是一个例子: 1. 确定通信波特率:首先需要确定ESP32和STM32之间串口通信的波特率。可以选择合适的波特率,例如9600、115200等。 2. 数据格式:确定数据传输的格式,可以使用8位无校验位的数据传输方式。 3. 结构:通信时,可以使用的概念来传输数据。例如,一个完整的数据可以包含以下几个部分: - 头:用于标识一数据的开始,可以使用特定的字符或者特殊的字节组合作为头标志。 - 数据长度:用于记录数据的长度,可以使用2字节表示,即16位。 - 数据内容:实际传输的数据内容。 - 校验和:为了确保数据的完整性,可以使用校验和字段进行校验。可以选择使用校验和算法,如CRC校验。 - 尾:用于标识一数据的结束,可以使用特定的字符或者特殊的字节组合作为尾标志。 4. 通信流程:可以约定一种通信流程来进行数据的传输。例如,ESP32作为主机发送数据时,首先向STM32发送一个请求的头,然后发送请求的数据长度和数据内容,接着计算校验和,并将校验和发送给STM32,最后发送尾。STM32收到头后,开始接收数据长度和数据内容,计算校验和并与接收到的校验和进行比较,若结果一致,则数据传输成功。 5. 错误处理:在通信中需要考虑错误处理。例如,可以约定某个特定的字符或者字节组合作为错误标志,当接收到错误标志时,需要重新发送数据或者进行其他的错误处理。 以上是一个简单的ESP32和STM32之间进行串口通信的协议示例,具体实现时可以根据实际需求和要求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值