精华内容
下载资源
问答
  • stm32串口发送一帧数据
    2021-05-18 11:35:56

    在进行数据传输的时候,发送一帧数据,为了保证其安全性,可以对一帧数据里面的东西进行“加密”

    #include <stdio.h>
    
    typedef struct My_Test
    {
      int head;   //帧头
      int length; 
      int type;
      int command;
      int work;
      int fre;
      int chan;
      int check;  //校验(异或值)
      int end;    //帧尾
    };
    
    void main()
    {
      struct My_Test one_test;  
      unsigned char test_rx[]="zzzzzzz"; 
      int mycheck=0;
      int i=0;
      
      
      one_test.head = 0xAA;
      one_test.length = 0x01;
      one_test.type = 0x02;
      one_test.command = 0x03;
      one_test.work = 0x04;
      one_test.fre = 0x05;
      one_test.chan = 0x06;
      
      //从帧头后到异或值前的6位进行异或
      //把数据存在数组里面
      test_rx[0] = one_test.length;
      test_rx[1] = one_test.type;
      test_rx[2] = one_test.command;
      test_rx[3] = one_test.work;
      test_rx[4] = one_test.fre;
      test_rx[5] = one_test.chan;
      
      //对数组里的数据挨个进行异或
      for(i=0;i<6;i++)
      {
      	mycheck ^= test_rx[i];
      }
      
      //得出一帧数据的异或值
      one_test.check = mycheck;
      one_test.end = 0xBB;
      
      //打印完整的一帧数据
      printf("%x-%x-%x-%x-%x-%x-%x-%x-%x\r\n",one_test.head,one_test.length,\
      		one_test.type,one_test.command,one_test.work,one_test.fre,\
      		one_test.chan,one_test.check,one_test.end);
      		
      //打印结果: aa-1-2-3-4-5-6-7-bb
      //异或值为 0x07
    }

    其中需要注意的点就是定义变量的时候记得赋初值,在实际使用中,我的程序上写的是 int mycheck;

    在有些编译器上是不会有什么问题,但当我使用在单片机上,直接static unsigned char mycheck;的时候,后面的出来的异或值是不对的

    由于在上位机上接收到数据后,也会计算异或值进行校验,然后把两个异或值进行比对,正确了才会做出相对应的指令

    由于比对不成功,所以在进行调试的时候发现这个很细节性的问题,就是初始化赋初值的问题!!(此博客只为了告诫自己要多注意细节上的问题,基础知识一定一定要扎实!!)

    更多相关内容
  • 使用stm32串口发送一帧数据,具体程序如下,相关知识点请自行脑补。 1、串口发送字符串 /***************** 发送一个字节 **********************/ //myUSARTx:具体串口 //ch: 一个8位的字节 void Debug_SendByte...

    使用stm32串口发送一帧数据,具体程序如下,相关知识点请自行脑补。

    1、串口发送字符串

    /*****************  发送一个字节 **********************/
    //myUSARTx:具体串口
    //ch: 一个8位的字节
    void Debug_SendByte( USART_TypeDef * myUSARTx, uint8_t ch)
    {
    	/* 发送一个字节数据到USART */
    	USART_SendData(myUSARTx,ch);
    		
    	/* 等待发送数据寄存器为空 */
    	while (USART_GetFlagStatus(myUSARTx, USART_FLAG_TXE) == RESET);	
    }
    
    /*****************  发送字符串 **********************/
    //myUSARTx:具体串口
    //str:字符串
    void Debug_SendString( USART_TypeDef * myUSARTx, char *str)
    {
        uint8_t next=0; //指向下一个字节的变量
        do 
        {
           Usart_SendByte( myUSARTx, *(str + next) );
           next++;
        }  while(*(str + next!='\0');
      
      /* 等待发送完成 */
      while(USART_GetFlagStatus(myUSARTx,USART_FLAG_TC)==RESET)
      {}
    }
    
    
    //实际使用
    Debug_SendString(DEBUG_USARTx,"AA A1 A2 A3 A4 A5 A6 A7 A8 BB");

    2、串口发送结构体数据

    typedef struct My_Test
    {
      uint8_t head;   //帧头
      uint8_t length;
      uint8_t type;
      uint8_t command;
      uint8_t work;
      uint8_t fre;
      uint8_t chan;
      uint8_t check;
      uint8_t num;
      uint8_t end;    //帧尾
    }My_Test;
    
    //实际使用
    My_Test mytest;
    
    void My_Struct_Test(My_Test *mytest)
    {
      mytest->head = 0xAA;  //帧头数据
      mytest->length = 0xA1;
      mytest->type = 0xA2;
      mytest->command = 0xA3;
      mytest->work = 0xA4;
      mytest->fre = 0xA5;
      mytest->chan = 0xA6;
      mytest->check = 0xA7;
      mytest->num = 0XA8;
      mytest->end = 0xBB;  //帧尾数据
    }
    
    void send_data(My_Test*mytest,uint8_t len)
    {
      static uint8_t date=0,i=0;
      for(i=0;i<len;i++) //使用sizeof计算结构体
      {
        date = *(((uint8_t *)&mytest->head)+i); //从帧头开始 然后依次向下指向
        USART_SendData(DEBUG_USARTx,date); //发送一个字节
        while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TC)!= SET);
      }
    }
    
    //具体调用
    My_Struct_Test(&mytest);           //赋值
    Debug("sizeof:%d\r\n",sizeof(mytest));  //sizeof:10
    send_data(&mytest,sizeof(mytest)); //发送一帧数据
    

     

    展开全文
  • STM32串口接收一帧数据的写法,数据包括帧头,功能帧,数据帧,校验位!
  • 因此在stm32串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据! 原文链接:...

    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!因此在stm32的串口中断中,还有一个IDLE中断,用来产生串口接受一帧数据而产生的中断,比如说串口发来n个数据,会产生n次接收中断和一次IDLE中断,因此方便使用者来接收主机发送或者从机返回的数据!

    原文链接:https://blog.csdn.net/qq_35341807/article/details/79157437

    1、配置串口中断

    void USART1_Configuration(void)
    {
    	USART_InitTypeDef USART_InitStructure;
    	GPIO_InitTypeDef GPIO_InitStructure;
    	/* Configure USART1 Rx (PA.10) as input floating */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		  //¸¡¿ÕÊäÈëģʽ	   
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	/* Configure USART1 Tx (PA.09) as alternate function push-pull */
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			  //¸
    	GPIO_Init(GPIOA, &GPIO_InitStructure);
    	
    	USART_InitStructure.USART_BaudRate = 9600;						//
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;		//
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;			//
    	USART_InitStructure.USART_Parity = USART_Parity_No;				//
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   //
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;					
    	/* Configure USART1 */
    	USART_Init(USART1, &USART_InitStructure);							
    	/* Enable USART1 Receive and Transmit interrupts */
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                    //
    	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//
    	/* Enable the USART1 */
    	USART_Cmd(USART1, ENABLE);	                  //
    }
    

    关键

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//没收到一个字节进入一次中断
    USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); //开启串口空闲中断,每收到一帧数据进入一次中断
    

    2、串口中断函数

    处理一帧数据中所需要的内容

    一帧数据原始内容:
    在这里插入图片描述
    我要提取出这帧数据中的31.93

    char rece_buffer[BUFSIZ];
    int RxCounter;
    
    void USART1_IRQHandler(void)	
    {
    	 u8 clear=clear;
    	 USART_ClearFlag(USART1,USART_FLAG_TC);
     //接收一帧数据
    	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)        
    	   {
     
               rece_buffer[RxCounter++]=USART1->DR;
    	   }
    		 
    	 else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
    	        {					
                    clear=USART1->SR;
                    clear=USART1->DR;						
    	              RxCounter=0;
    						
    						//温度传感器的一帧数据,对需要的内容进行提取
    						if((rece_buffer[0]=='o')&&(rece_buffer[1]=='b')&&(rece_buffer[2]=='j'))
    						{
    								if(rece_buffer[9]=='-')  //¸ºÊý
    								{
    								;
    								}
    						else
                {
    								if(rece_buffer[10]=='.')   //x.xx
    								{
    								obj=(rece_buffer[9]-0x30)*100+(rece_buffer[11]-0x30)*10+(rece_buffer[2]-0x30);
    								}
    								if(rece_buffer[11]=='.')   //xx.xx
    								{
    								obj=(rece_buffer[9]-0x30)*1000+(rece_buffer[10]-0x30)*100+(rece_buffer[12]-0x30)*10+(rece_buffer[13]-0x30);
    								}
    								if(rece_buffer[12]=='.')   //xxx.xx
    								{
    								obj=(rece_buffer[9]-0x30)*10000+(rece_buffer[10]-0x30)*1000+(rece_buffer[11]-0x30)*100+(rece_buffer[13]-0x30)*10+(rece_buffer[14]-0x30)*10;
    								}
    								
    						    obj_T=obj/100;
    						}
    						printf("目标温度:%f",obj_T);
    						}
    						//printf("%s",rece_buffer);
                    }	
    					
    }
    

    最终获得需要是数据
    在这里插入图片描述

    展开全文
  • 有上位机通过VS的串口接口发送一帧数据有200ms间隔,最后两个byte都是crc校验。同一时间只会存在一种发送方式。原方案:缓冲区长度128byte,接收数据8~33byte不等,1ms检查一次接收长度是否变化,若长度无变化则...

    需求:波特率19200,接收不定长的数据,有其他单片机按字节发送,但是一帧数据有1.7ms间隔。有上位机通过VS的串口接口发送,一帧数据有200ms间隔,最后两个byte都是crc校验。同一时间只会存在一种发送方式。

    原方案:缓冲区长度128byte,接收数据8~33byte不等,1ms检查一次接收长度是否变化,若长度无变化则停止一帧的接收。

    问题:接收其他单片机数据没问题,但是接收上位机数据会出现分段的情况,不完整的数据导致后面crc校验不通过。

    解决:接收完数据后立即进行crc校验,不通过则累计长度,下次数据续接本次数据末尾,直至拼接数据crc校验通过或者总时间超过200ms。

    可以看到转移数据后,缓冲区内存立马被DMA修改了
    在这里插入图片描述

    展开全文
  • 文章目录0 传输引脚1 传输一个字节... 抛开奇偶校验,多个停止位的情况, 假设, 我们设置一帧数据有十位, 里边包含一个起始位, 八个数据位, 还有一个停止位. 那么,我们发送一个字节, 只需要一次传输. 我们以传输0x01为例
  • 这里写目录标题串口发送数据串口接受数据 串口发送数据 1、串口发送数据最直接的方式就是标准调用库函数 。 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 第个参数是发送的串口号,第二个参数是...
  • STM32串口中断接收一帧数据

    千次阅读 2021-01-03 22:52:57
    STM32串口中断接收一帧数据 IDLE即串口空闲中断,串口收到一帧数据后,发生的中断。比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。因为只有接收...
  • 当接收到一个数据时就产生一个中断,将接收到的数据通过移位寄存器移位到RDR中,此时我们可以直接将接收到的数据发送出去,则完成了一个字符的通讯,以后每次接收到一个数据发送一数据出去,如此便实现了接收到...
  • 教你使用stm32接收串口一帧数据

    万次阅读 多人点赞 2018-01-25 08:47:39
    stm32支持接受单个数据或者一帧数据,若配置单个数据接收中断的话,会出现接收包丢包,数据不完整的情况!...若想发送一帧数据串口请参照我博客中的另一篇文章——教你如何使用stm32发送一帧数据! 为
  • stm32串口发送和接受多个数据实战教程
  • 话不多说先上代码 typedef struct shuju { u8 sj0; //头 u8 sj1; u8 sj2; u8 sj3; u8 sj4; u8 sj5; u8 sj6; u8 sj7; u8 sj8; u8 sj9; //尾 }shuju; //实际使用 ... //数据 ..
  • 关于STM32串口3的使用,接收并解析一帧数据

    万次阅读 多人点赞 2020-06-03 10:21:38
    关于STM32串口3的使用,接收并解析一帧数据stm32串口1被使用时,我们可以使用其他串口来使用。 步骤: 串口3定义、初始化; 串口3中断服务函数(接收的一帧数据并判断是否正确); 主函数使用; 首先,我们要将...
  • [STM32] 串口数据帧处理(第弹)

    千次阅读 2021-09-06 19:10:08
    文章目录1 串口使用的常用场景2 字节处理总结 1 串口使用的常用场景 使用串口的主要目的是实现数据的交互,数据的交互的方法脱身于常用的场景。这里描述个比较典型的场景: MCU作为主控制器通过串口和外部的...
  • stm32串口发送接口

    2022-05-27 02:08:54
    本文记录一下stm32标准库实现串口发送功能的接口函数。 轮询方式发送串口数据 1、标准库实现 /*=============================通过发送函数==============================*/ /** * 功能:串口写字节函数 * 参数1...
  • STM32-串口发送数据-过程与配置

    千次阅读 2021-09-21 09:53:05
    串口发送过程配置流程 HAL库中串口寄存器定义文件: stm32f429xx.h F429芯片 stm32f767xx.h F767芯片 stm32f103xx.h F103芯片 stm32fnnnx.x.h 其他芯片 可以在其中找到USART_TypeDef:最终会映射到寄存器的地址。 ...
  • STM32F07使用OV2640摄像头,在LCD上面显示实时图像的同时,可以通过按键发送目前一帧RGB565图像数据串口
  • 接收到的数据如下图所示 当发送“01 10 00 28 00 01 02 00 04 A1 BB”后 设备会发送一次回复指令和n次测距数据直到收到停止命令 ,窗口助手接收到回复指令“01 10 00 28 00 01 81 C1”,然后就不断地发送测距数据帧 ...
  • STM32串口接收及发送数据程序分享

    千次阅读 2021-10-29 21:10:52
    篇文章分享了CVI发送数据STM32的程序,(LabwindowsCVI上位机通过串口STM32发送数据程序分享)确实已经过去很长时间了,现在才动手做接收部分属实是有些懒惰了。话不多说我们进入正题。 如果只是单纯的想...
  • 这里写自定义目录标题前言所涉及的芯片STM32F103RCT6MAX3483主要特点使用说明代码部分初始化相关代码.h文件.C文件与MAX3483相关的代码部分.h文件.c文件中断服务代码.c文件末尾 前言 这是我的第篇CSDN,记录一些...
  • http://blog.csdn.net/kevinhg/article/details/40991655STM32串口发送必须先检测状态,否则第个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现个...
  • STM32串口接收不定长数据帧->链表数据帧说明二级目录三级目录 数据帧说明 STM32数据寄存器为USARTx->DR寄存器 二级目录 三级目录
  • STM32F407ZG 串口通信+固定尾传输数据帧
  • stm8s003单片机串口接收任意长度数据,并通过串口发送出去。通过定时器计时判断数据是否发生完成。若超过5ms未接收到数据,认为数据接收完成,将接收到的数据发送出去。
  • http://blog.csdn.net/kevinhg/article/details/40991655STM32串口发送必须先检测状态,否则第个字节无法发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现个...
  • STM32 串口 发送 必须 先检测 状态,否则 第个 字节 无法 发出,发送完毕,必须检测发送状态是否完成,否则,发送不成功,使用stm32f10x调试串口通讯时,发现个出错的现象,硬件复位重启之后,发送测试数据0x01 ...
  • stm32串口中断接收一帧数据

    万次阅读 多人点赞 2017-02-18 17:11:53
    最近用到stm32串口,中断个字符个字符接收好心累,网上度了一下发现了篇好的帖子,和大家分享一下,原贴地址:http://www.51hei.com/bbs/dpj-39885-1.html 再次感谢原贴楼主的分享,为了方便大家,我把原文...
  • STM32串口发送数据段代码理解(纯属个人理解,如有不对,敬请指出) 本人是位单片机的初学者,最近研究串口发送数据时对以下代码不能理解,通过几天的思考,有所顿悟,特将自己的理解写下来,希望能帮到像我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,544
精华内容 1,817
热门标签
关键字:

stm32串口发送一帧数据