精华内容
下载资源
问答
  • 万能的串口数据接收处理方法

    万次阅读 多人点赞 2018-12-14 10:17:34
    接下来就分享一下本人在项目中使用串口接收数据处理的方法。  先介绍下主要思路,首先需要开一个定时器,我们接收串口端发来的数据,这个时候会产生接收中断,在中断里面我们做三件事,1.启动定时器;2.清除时间...

            搞单片机,肯定少不了串口的使用,不管是调试也好,与其他设备通信也好,是我们不可或缺的利器。接下来就分享一下本人在项目中使用串口接收数据及处理的方法。

            先介绍下主要思路,首先需要开一个定时器,我们接收串口端发来的数据,这个时候会产生接收中断,在中断里面我们做三件事,1.启动定时器;2.清除时间计数器;3.接收数据存放到事先定义好的缓存buffer;然后我们在定时器中断里面也做三件事:1.累加时间计数器;2.判断时间计数器是否超过我们设定的阈值(超过,说明等待了一段时间没有收到数据,判定数据接收完毕,具体时间是具体情况而定)3.判定接收完毕数据之后,清除计数器,处理接收数据的buffer,清除buffer,关闭定时器;这是主要思路,也是最为重要的部分,最后给出我的代码,可以移植到任何处理器上面,非常实用。这里在强调一下定时器的问题,我们有两种用法,一是,需要用到定时器就打开,不用就关闭,上面介绍的思路是这种使用方法;二是,打开定时器之后不关闭,让其一直运行,这样的好处是我们可以用一个定时器处理多个串口通信问题,当做一个时基,因为实际项目中很多情况都是同时会使用多个串口;下面我给的代码用的是第二种方法,了解了思路其实是很简单的事情。

    串口数据结构体:

    处理接口函数

    串口中断处理

    定时器中的数据处理,里面只是把接收到的数据原封不动传回去,使用send_str()函数,在此地方大家可以加入自己数据处理的方法

    上述接口函数的具体实现

    至此结束,希望对大家有所帮助,欢迎分享大家自己的想法!!!

    展开全文
  • 串口数据接收处理

    千次阅读 2017-08-17 18:17:49
    串口接收函数只需要管理数据的接收就行了,不必管理相应数据接收的是什么,还有顺序对不对,真正寻找数据的地方是在数据处理的地方。void USART2_IRQHandler(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) !...

    串口接收函数只需要管理数据的接收就行了,不必管理相应数据接收的是什么,还有顺序对不对,真正寻找数据的地方是在数据处理的地方。

    void USART2_IRQHandler(void)
    {
    
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) 
        {
            if(esp8266_cnt >= sizeof(esp8266_buf))  esp8266_cnt = 0; 
            esp8266_buf[esp8266_cnt++] = USART2->DR;
    
            USART_ClearFlag(USART2, USART_FLAG_RXNE);
        }
    
    }

    数据处理端,函数来自于OneNET麒麟板程序

    void OneNet_App(void)
    {
    
        char *dataPtr;
        char numBuf[10];
        int num = 0;
        unsigned char *cmd;
    
        cmd = (unsigned char *)strchr((char *)esp8266_buf, ':');
        if(cmd == NULL)    
            return;
    
        cmd++;
        if(cmd[0] == 0xA0)                                  
            OneNet_Replace(cmd, 4);     
        else
            return;
    
        dataPtr = strstr((const char *)cmd, "}");           //
    
        if(dataPtr != NULL)                                 //
        {
            dataPtr++;
    
            while(*dataPtr >= '0' && *dataPtr <= '9')       //
            {
                numBuf[num++] = *dataPtr++;   //
            }
    
            num = atoi((const char *)numBuf);               //
    
            if(strstr((char *)cmd, "redled"))               //
            {
                if(num == 1)                                //
                {
                    Led5_Set(LED_ON);
                }
                else if(num == 0)                           //
                {
                    Led5_Set(LED_OFF);
                }
            }
                                                            //
            else if(strstr((char *)cmd, "greenled"))
            {
                if(num == 1)
                {
                    Led4_Set(LED_ON);
                }
                else if(num == 0)
                {
                    Led4_Set(LED_OFF);
                }
            }
            else if(strstr((char *)cmd, "yellowled"))
            {
                if(num == 1)
                {
                    Led3_Set(LED_ON);
                }
                else if(num == 0)
                {
                    Led3_Set(LED_OFF);
                }
            }
            else if(strstr((char *)cmd, "blueled"))
            {
                if(num == 1)
                {
                    Led2_Set(LED_ON);
                }
                else if(num == 0)
                {
                    Led2_Set(LED_OFF);
                }
            }
        }
    
        ESP8266_Clear();                                    //
    
    }
    展开全文
  • labview实时数据接收分析存储,主要是数据包的解析,需要根据具体情况转换数据宝解析代码
  • c#串口数据接收处理大纲

    千次阅读 2017-11-13 21:21:29
    c#串口数据接收处理大纲
    1判断串口接收区缓存大小  大于某一值开始处理
    2将缓存区中的数据读到缓存数组 开始判断这个数组中的数据
    3选出有用的数据存到链表中  也就是真正的数据中
    4另开一个线程去处理真正的数据  
    5如果要有显示和画图的画要在开一个线程 也就是说此时是4个线程  加上主线程

    核心: 数据的接收和处理要分开   事件中只接收而不处理

    至于开始判断真正的数据的步骤如下   (即2的第一部分)
    先读一个字节  如果符合包头   则读固定长度的数据到一个缓存数组  在判断包尾和其他数据是否正确  如果正确则存到真正数据中
    注意   此方法理论上无错 但是在c#中读一个字节的函数只能在串口开启的是后使用 所以会有关闭串口按钮无法关闭的bug 所以最好不用读一个的函数而是直接读到一个新的链表里去判断。
    展开全文
  • 之前在做项目的时候,串口接收数据要及时进行处理,虽然采用了自定义的串口协议,但是协议的包尾只有一个字节,经常判断不准数据是否接受完毕,所以就采用计时器+串口的方式来判定串口是否接受完成。 核心思想 ...
    使用背景:

    之前在做项目的时候,串口接收的数据要及时进行处理,虽然采用了自定义的串口协议,但是协议的包尾只有一个字节,经常判断不准数据是否接受完毕,所以就采用计时器+串口的方式来判定串口是否接受完成。

    核心思想

    根据波特率来计算接收一个字节所需要的时间,当超过这个时间没有收到数据,则表明这一帧数据已经接受完毕

    实现方法

    串口中断函数接收第一个字节之后,开启定时器计数。接受下一个字节的时候清空定时器计数。如此,当没有数据接收后,计时器无法清零,当计时器计数超过设定的数值之后,触发定时器溢出中断,此时数据即接收完毕

    Created with Raphaël 2.2.0 开始 定义 计时标志位、完成标志位 接收数据,清空计时标志位 开启定时器,计时标志位增加 串口未收到数据? 计时标志位增加,超过设定值 接收完成标志位置1,处理数据 结束 yes no

    下面是代码:

    • 1、为了方便,定义一个结构体,主要内容如下所示:
    typedef struct _UART_FLAG_STRUCT
    {
    	uint8_t UART1Flag;//数据接受完成标志
    	uint8_t UART1String[160];//最大长度,自定义
    	uint8_t UART1Counter;//收到的数据长度,计数作用
    	uint8_t usart1_start;//接收开始,定时器计时启动
    	uint8_t usart1_counter;//定时器计时次数
    }	UartFlagSt;
    
    UartFlagSt UartFlagStC;
    
    • 串口配置:
    /************************************************
    | 关键词 |USARTInit(u32 band)
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |u32 band,配置波特率
      - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |None
      - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |初始化串口1,使能中断
    **************************************************/
    void USARTInit(u32 band)
    {
    	GPIO_InitTypeDef  GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef  NVIC_InitStructure;
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
    	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_9;//send
    	GPIO_Init(GPIOA,&GPIO_InitStructure);
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//receive
    	GPIO_Init(GPIOA,&GPIO_InitStructure);
    	
    	USART_InitStructure.USART_BaudRate = band;
    	USART_InitStructure.USART_HardwareFlowControl = 0;
    	USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
    	USART_InitStructure.USART_Parity = USART_Parity_No;
    	USART_InitStructure.USART_StopBits =USART_StopBits_1;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    	USART_Init(USART1,&USART_InitStructure); //初始化串口1
    
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStructure);
    	
    	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启串口接受中断
    	USART_Cmd(USART1,ENABLE);                    //使能串口1 
    }
    
    /************************************************
    | 关键词 |UART1_SendString(uint8_t* str,uint8_t counter)
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |uint8_t* str    发送的数据
    |	|uint8_t counter 发送数据的长度
      - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |无
      - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |串口1发送函数
    **************************************************/
    void UART1_SendString(uint8_t* str,uint8_t counter)
    {
    	for(int i = 0;i<counter;i++)
    	{
    		USART_SendData(USART1,*str);
    		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
    		str++;
    	}
    }
    
    • 定时器配置:
    /************************************************
    | 关键词 |TIM2_Init(u16 arr,u16 psc)
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |u16 arr 周期,u16 psc 预分频
    | - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |无
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |定时器初始化
    **************************************************/  
    void TIM2_Init(u16 arr,u16 psc)
    {
    	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    	
    	TIM_TimeBaseStructure.TIM_Period = arr; //	周期 72-1 max
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频 
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
    	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 
    	TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE );
    
    	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
    	NVIC_Init(&NVIC_InitStructure);
    
    	TIM_Cmd(TIM2, ENABLE);
    }
    
    • 串口中断函数:
    /************************************************
    | 关键词 |USART1_IRQHandler
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |None
      - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |None
      - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |1、消除错误;
    |	|2、将数据接受至结构体中的数,
    |       |并启动UartFlagStC.usart1_start = 1;UartFlagStC
    |       |.usart1_counter = 0;定时/刷新功能。
    **************************************************/
    void USART1_IRQHandler(void)
    {
    /*****此段注释代码为消除各种串口错误,在串口环境很差的情况下可以直接将此段代码取消注释,基本可以保证串口代码正常工作******
    	if((USART_GetITStatus(USART1,USART_IT_ORE) == SET)||(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET))
    	{
    		USART_ReceiveData(USART1);
    		USART_ClearITPendingBit(USART1,USART_IT_ORE);
    		USART_ClearFlag(USART1,USART_IT_ORE);
    	}
    	
    	if((USART_GetITStatus(USART1,USART_IT_NE) == SET)||USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET)
    	{
    		USART_ClearITPendingBit(USART1,USART_IT_NE);
    		USART_ClearFlag(USART1, USART_FLAG_NE);
    	}
    
    	if((USART_GetITStatus(USART1,USART_IT_FE) == SET)||USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)
    	{
    		USART_ClearITPendingBit(USART1,USART_IT_FE);
    		USART_ClearFlag(USART1, USART_FLAG_FE);
    	}
    
    	if((USART_GetITStatus(USART1,USART_IT_PE) == SET)||USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)
    	{
    		USART_ClearITPendingBit(USART1,USART_IT_PE);
    		USART_ClearFlag(USART1, USART_FLAG_PE);
    	}
    ****************************************************************************************************/
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    	{
    		if(UartFlagStC.UART1Counter<160)//设定的数组最大为160,要小于这个数,防止溢出
    		{
    			UartFlagStC.UART1String[UartFlagStC.UART1Counter] = USART_ReceiveData(USART1);//将数据存到数组里面
    			UartFlagStC.UART1Counter++;//收到的数据个数+1
    			UartFlagStC.usart1_start = 1;//定时器开始工作
    			UartFlagStC.usart1_counter = 0;//清空定时器计数
    		}else UartFlagStC.UART1Counter = 0;//如果接受的数据超过设定值,则清空接收值,防止数据溢出
    		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
    	}
    }
    

    可以看到,当有数据进来的时候,UartFlagStC.UART1Counter不断自增,数据将会依次存入UartFlagStC.UART1String[]数组中。
    同时,UartFlagStC.usart1_start计时器开始计数标志位置一(让在定时器中断函数里面自增的UartFlagStC.usart1_counter得以正常增加),同时也将UartFlagStC.usart1_counter清零,以表示有数据接收,防止超过设定值,使得UartFlagStC.UART1Flag置一,错误的提示数据提前接收完成。

    • 定时器中断函数:
      在下面代码提示插入任务的地方插入我们想执行的任务/代码,即可正常使用
    /************************************************
    | 关键词 |TIM2_IRQHandler
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |无
    | - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |无
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |定时器中断函数
    **************************************************/  
    void TIM2_IRQHandler(void)
    {
    	if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
    	{
    		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    		/**********************/
    		 在此处插入执行的任务。
    		/**********************/
    	}
    }
    
    • 关键代码:
      这个代码是我们任务重最重要的部分,主要实现了我们上述流程图的计时/完成任务,之所以将这部分功能单独拆解写成一个函数的形式,主要是为了移植方便,并且在定时器多任务的时候让定时器中断函数看起来更整洁一点。
    使用方法:将此函数插入定时器中断函数。
    /************************************************
    | 关键词 |USART1InsetTimer
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |None
      - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |无
      - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |嵌入定时器中断函数中,串口数据接收完毕后
    |		 |立刻执行,适用于延时性小、数据量密的场景。
    **************************************************/
    void USART1InsetTimer(void)
    {
    	if(UartFlagStC.usart1_start == 1)//此标志位是在串口接收数据时候会置1
    	{
    		UartFlagStC.usart1_counter++;//定时器计数标志位
    		if(UartFlagStC.usart1_counter >USART_COUNTER_9600)//如果超过波特率为9600时一个字节的所需要的时间,时间计算方法下面有讲解
    		{
    			UartFlagStC.UART1Flag = 1;//接收完成标志位置1
    			UartFlagStC.usart1_counter = 0;//计数值清零
    			UartFlagStC.usart1_start = 0;//计数器启动标志位置0
    		}
    	}
    }
    

    在这里,当(UartFlagStC.usart1_start置一后,UartFlagStC.usart1_counter会不断自增(串口中断中会清零此计数位),而一旦超过设定值USART_COUNTER_9600,就会将接收完成标志位UartFlagStC.UART1Flag置一,同时清空定时器技术位UartFlagStC.usart1_counter,并清零计数允许标志位UartFlagStC.usart1_start

    • 处理数据:
      如果处理数据很快的话可以直接放在定时器中断函数里面执行,如果还有比较长的延时函数,或者在执行过程中花费时间太久则可以放入主函数循环中进行处理:
      老规矩,先进行封装一层:
    /************************************************
    | 关键词 |USART1Hanndle
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |None
      - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |无
      - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |串口1接收数据处理函数,任务若花费时间较长,
    |        |可放置于while()循环中,由定时器确定是否执行。
    **************************************************/
    void USART1Hanndle(void)
    {
    	if(!UartFlagStC.UART1Flag) return;
    	/*********执行任务*************/		
    	printf("%s\r\n",UartFlagStC.UART1String);
    	/****************************/
    	memset(UartFlagStC.UART1String,0,160);
    	UartFlagStC.UART1Counter = 0;
    	UartFlagStC.UART1Flag = 0;
    }
    

    主函数实现:

    /************************************************
    | 关键词 |main
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  入参  |None
    | - - - - - - - - - - - - - - - - - - - - - - - - 
    | 返回值 |无
    | - - - - - - - - - - - - - - - - - - - - - - - -
    |  功能  |主函数入口,配置文件,设置时钟,滴答定时器
    |        |周期,并开启看门狗
    **************************************************/  
    int main()
    {
    	SystemInit();   				 	//系统时钟72MHz
    	SysTick_Config(SystemCoreClock/1000);        /* SysTick 1 msec interrupts */
    	TIM2_Init(71,999);//1ms中断一次
    	USARTInit(9600);//波特率为9600
    	while(1)
    	{
    		USART1Hanndle();
    	}
    }
    

    流程/细节讲解

    • 不同波特率延时时间计算:

    可能会有人对void USART1InsetTimer(void)中的溢出时间USART_COUNTER_9600有疑问,不知道如何计算,计算方法如下:

    首先,1个字符串口包含起始位数据位校验位停止位,其中有些位长度可以自己设定,
    这里我们按一个字节传输有1+8+1+1共10位长度来计算。
    波特率表示的意思是在1sec内可以传输的位数


    接下来就是一元一次方程


    设1个字节所用时间为X,波特率为9600,则:

    ( 1 ∗ 10 ) / X = 9600 / 1000 ( m s ) (1 * 10) / X = 9600 / 1000(ms) (110)/X=9600/1000(ms)
    解得X ≈ 1.04167 ms = 2(X为整型,必须向上取整!)

    X代表的意思是一帧数据传输的时间,意思就是每过X单位时间,即有一个数据接受完毕,同时下一个数据也即将接受。
    USART_COUNTER_9600的数值设定为X1
    UartFlagStC.usart1_counter则只要在串口中断函数内清空,那么UartFlagStC.usart1_counter就不会超过X,
    那么也就不会将接受完成标志位UartFlagStC.UART1Flag置1;
    一旦没有数据继续接收,那么UartFlagStC.usart1_counter在中断函数里面将不断自增,直至超过X,此时接受完成标志位UartFlagStC.UART1Flag将会置1。
    同时,时间设定要根据波特率的不同要计算不同的数值。

    下载地址 :https://download.csdn.net/download/qq_31431301/12287318


    1. 实际使用过程中,一定要将USART_COUNTER_9600的设定值大于X,因为在此方法中,串口中断函数不仅要判断数据接收标志位,还有清零置一的操作,实际工作时间肯定要大于X!,一般取3~5倍X的时间。 ↩︎

    展开全文
  • 串口数据接收处理的一种方法

    千次阅读 2019-09-11 16:14:13
    处理串口接收到的数据时,面临的问题主要是是如何解析接收到的数据,对于错误的如何处理等。不管是在微控制器中使用串口还是在桌面应用中使用串口,都需要解决这个接收的数据包处理的问题。最近在做一个应用,主要...
  • 串口数据接收的常用处理方式

    千次阅读 2020-02-01 19:51:55
    串口数据接收的常用方式有三种: 使用状态机机制 通过判断结束字符的方式 通过数据接收超时的方式 三种方式的优缺点 使用状态机机制,这种方式常用于接收16进制数据的情况,比较典型的例子是modbus-rtu数据的接收。...
  • C#对串口数据接收处理

    万次阅读 2016-04-08 19:07:24
    个人的意见思路: 1.先获取足够的数据信息。 2.判断帧头,获取需要的数据信息 3.帧尾结束,执行下一次判断 4.移除处理过的数据 ...用来存放所有的数据,在接收函数里,通过buffer.AddRange()方
  • 本源码在VS2013平台上,使用C#编程,实现了多串口通信的数据接收处理,实用性强,代码简洁,内置使用说明
  • 本发明公开了一种串口数据接收处理方法, 包括:根据接收到的待处理数据的数据字节,确 认所述待处理数据的字节数量;以已确认的所述 字节数量为所述待处理数据分配存储空间;通过 已分配的存储空间接收所述待处理...
  • C#代码基本如下: private List<byte> buffer = new List<byte>(4096);  void comm_DataReceived(object sender, ...// 如果正在关闭,忽略操作,直接返回,尽快的完成串口监听...
  • 按照伍兄的博文抄下来的。 博文地址:http://www.cnblogs.com/wuhuacong/archive/2011/07/19/2111055.html#commentform 为了赚点下载分。谢谢!
  • 串口通信——接收串口数据处理(C语言)

    万次阅读 多人点赞 2017-06-20 13:53:48
    串口通信——接收串口数据处理(C语言)
  • STM32串口接收数据处理方法

    千次阅读 2021-03-31 09:16:44
    STM32串口接收数据处理方法 STM32串口接收定长数据处理方法 STM32串口接收定长数据处理方法非常简单,我目前做项目都是用的这个,也可用做处理MODBUS协议,直接上代码。 void USART1_IRQHandler(void) //串口1...
  • 串口接收数据与分析处理

    千次阅读 2018-07-19 10:06:30
    一、每接受完一个字节的数据,进入一次中断。 u8 USART_RX_BUF[USART_REC_LEN]; 【注】:在STM32例程中,定义 u8 USART_RX_BUF[USART_REC_LEN]; 把一个字节的数据放入数组中,u8是8位 unsigned int型,u8就是...
  • QT串口接收数据处理

    千次阅读 2020-04-02 15:07:49
    以ReadyRead为接收的标志时容易造成数据混乱,比如用串口循环发送两条消息:“123”和“456”,如果在不对接收做出护理的话可能接收到的就是”234“和”561“,就失去了信息的真实性,因此处理添加一些标志 就可避免...
  • 串口数据接收简单算法

    千次阅读 2019-02-15 14:59:23
    前言:工作中经常会用到串口数据接收,多数串口数据接收比较简单而且通用,正好今天用到了,写下留存。 实例: 我们这里跳过串口波特率等的设置,直接到数据接收方法。 此处模拟串口数据长度76,头码0xff //每次...
  • 在用单片机接收串口数据时,当接收数据不定长时 ,需要判断出何时接收完成,之前我写的一个文章是在QT中处理如何判断接收完成的,在单片机中的思路其实是一样的,只不过在QT中实例化了一个定时器,在未超时接收到...
  • //定义缓冲区,因为串口事件触发时有可能收到不止一个字节 ComDevice.Read(data, 0, line); foreach(byte Member in data) //遍历用法 { nstr += (char)Member;//读取数据 if (nstr.Length >= 4) {//判断数据...
  • linux 串口数据接收 发送实例

    热门讨论 2010-02-25 00:13:50
    此例子经过验证 不是转载 Linux 串口 数据接收 发送 <其中列举 串口 字符串和16进制数的发送和接收 以及 串口接收字符串和16进制数,解决16进制数0x0a 0x0d 0x13 0x11接收异常的问题 此例子没有线程>
  • 这里是c#串口自动接收处理后实时刷新处理,实时显示。可以直接new了,直接用看效果。
  • 野火 RTT 改的 三个串口 dma 接收 接收处理数据,但是串口一直不能正常发送数据 Uart2 Uart3 都有问题,请赐教,确实没有分了 ** 调用 ** RS485_SEND_EN(ON); rt_thread_delay(200); Usart_Send...
  • 串口接收数据一般会采用串口中断方式自动接收,要想接收不定长度数据,就需要让单片机在接收完成一帧数据之后,自动告知系统数据已经接收完成了,这个过程其实都是通过单片机的中断机制实现的,stm32单片机串口接收...
  • 基于Linux平台的串口数据接收源程序,可以直接在Linxu平台下进行功能测试。
  • 通过微软的串口调试助手,利用JavaScript脚本编写数据采集程序,程序设计,是通过查阅资料和程序组合进行设计,ModBus RTU协议的使用,以及设备的连接是通过RS485进行数据连接。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,189
精华内容 15,675
关键字:

串口数据的接收与处理