精华内容
下载资源
问答
  • 笔记-关于Modbus一帧数据长度

    千次阅读 2019-05-30 16:01:27
    Modbus一帧数据长度为:127.

    Modbus一帧的数据长度为:127.

    展开全文
  • 关于可变帧长度数据的解析

    千次阅读 2018-11-15 16:54:10
    在项目中需要解析另主机的数据,而该主机数据是由积木式拼搭而成的可变的数据格式,每个积木所包含的数据长度不定,但是都小于10; 这里说明一下我在实际应用中的解决方法: 首先是和另主机定义好数据格式...

    关于可变帧长度数据的解析
    在项目中需要解析另一主机的数据,而该主机数据是由积木式拼搭而成的可变的数据帧格式,每个积木所包含的数据长度不定,但是都小于10;
    这里说明一下我在实际应用中的解决方法:
    首先是和另一主机定义好数据帧格式协议,定义格式如下表:

    帧头 命令字 帧长度 参数 校验和
    0x5A Instruction Length Parameter1, Parameter2,Parameter3……. Check Sum

    帧头: 收到0x5A表示有数据到达;
    命令字:每个命令字代表本帧数据的含义;
    帧长度:表示本条帧数据的长度,Length = 参数长度;
    参数: 除了命令字外,补充其他更详细的信息,这里包括可变的积木数据;
    校验和:Check Sum = Instruction + Length + Parameter1 + Parameter2 + 。。。+ ParameterN
    下表是命令字的相关说明:
    命令字的相关说明

    参数说明:由于每个模块参数都有所不同,所以数据帧中不同ID,相同位置代表的含义也不同,在这里做个总结
    数据举例
    数据解析
    此表格不完全…

    具体的C代码解析
    串口中将数据转存,同时置一个标志位:

    CTRL_FLAG.BLOCK_FIRST_ROW_RECEIVE_OK_FLAG = TRUE ;///数据接收并校验完成标志位
    		CTRL_COUNT.BLOCK_CNT = UART_RX3_BUF[UART_RX3_BUF[2] + 2] ;///BB的个数
    		for(i=0;i<UART_RX3_CNT;i++)
    		{
    			UART_RX3_FIRST_ROW_DATA_BUF[i]=UART_RX3_BUF[i];///将接收的数据转存
    		}
    

    然后在程序中判断数据接收标志位是否进行解析,解析函数如下:

    if (CTRL_FLAG.BLOCK_FIRST_ROW_RECEIVE_OK_FLAG == TRUE)///数据接收并校验完成标志位
    {
    	block_data_receive_finish_ack(0x03);///数据接收完成  后告知开始模块   0822	   ;
    	for(i=0;i<CTRL_COUNT.BLOCK_CNT ;i++)///直到所有的数据都处理完成才退出
    	{
    		single_block_data_handle(i,UART_RX3_FIRST_ROW_DATA_BUF,block_sequence,1);///第1个BB,数据数组,数组起点(当前BB ID)
    		BLOCK_SEQUENCE[i] = UART_RX3_FIRST_ROW_DATA_BUF[block_sequence];	///第1个BB的ID
    		block_length_data = UART_RX3_FIRST_ROW_DATA_BUF[block_sequence-1];		///第1个BB 的数据长度
    		block_sequence = block_sequence + block_length_data + 1;		///计算下一个BB的ID数组位置(将这个BB长度+5)  供下一次传参使用
    	}
    

    }

    根据积木参数的数据进行解析,一个函数搞定:

    /*
    u8 sequence 			当前是第几个积木的数据
    u8 *UART_RX3_FIRST_ROW_DATA_BUF	接收到的数据区,待处理
    u8 number					当前处理的这个积木在数据区的开始
    u8 row 						是哪一行的数据
    
    */
    void single_block_data_handle(u8 sequence ,u8 *DATA_BUF , u8 number,u8 row)///处理当前单积木模块的数据
    {
    	u8 i = 0 ;
    //	PARAMETER	*PARAMETER_DATA ;
    	switch( DATA_BUF[number])///判断当前是那个模块
    	{
    //			case 1:///不存在1模块
    //				break;
    		case 2:				///模块2	---3参数
    		case 5:				///模块5	---3参数
    			for(i = 0 ; i< 3 ; i ++)
    			{
    				if(row ==1)
    					BLOCK_DATA[sequence][i] =  DATA_BUF[number+i+1];//
    				else if(row ==2)
    					BLOCK_SECOND_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    				else if(row ==3)
    					BLOCK_THIRD_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    			}
    			break;
    		case 3:				///模块3	---2参数
    		case 4:				///模块4	---2参数
    		case 7:				///模块7	---2参数
    			for(i = 0 ; i< 2 ; i ++)
    			{
    				if(row ==1)
    					BLOCK_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    				else if(row ==2)
    					BLOCK_SECOND_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    				else if(row ==3)
    					BLOCK_THIRD_DATA[sequence][i] =  DATA_BUF[number+i+1];///
    			}
    			break;
    		case 6:				///模块6			---1参数
    		case 8:				///模块8 左	---1参数
    			if(row ==1)
    				BLOCK_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==2)
    				BLOCK_SECOND_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==3)
    				BLOCK_THIRD_DATA[sequence][0] =  DATA_BUF[number+1];///
    			break;
    		case 9:				///模块9 右
    			break;
    		case 0x0B:				///舵机 抛球
    			if(row ==1)
    				BLOCK_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==2)
    				BLOCK_SECOND_DATA[sequence][0] =  DATA_BUF[number+1];///
    			else if(row ==3)
    				BLOCK_THIRD_DATA[sequence][0] =  DATA_BUF[number+1];///		
    			break;
    		
    		default:
    			break;			
    	}
    }
    

    致此,积木的数据解析已经完成,
    积木的数据存储在二位数组:BLOCK_DATA[][],
    积木顺序存储在BLOCK_SEQUENCE[];
    执行函数

    /*
    block_sequence	是第几个模块顺序
    返回值:当前模块是否执行完成
    */
    u8 block_data_deal(u8 block_sequence)///
    {
    	if((block_sequence!=last_block_sequence)&&(BLOCK_STATUS == 1))///数据回传,只回传一次  仅在是开始的时候执行
    	{
    		block_data_receive_finish_ack(0x02);
    		last_block_sequence = block_sequence;
    	}
    	if (BLOCK_STATUS == 3) ///暂停
    	{
    		Pause_Stop();
    	}
    	else if(BLOCK_STATUS == 1)///开始  
    	{
    		switch (BLOCK_SEQUENCE[block_sequence])///判断是哪个积木模块ID
    		{
    			case 2:
    				return (1);
    			case 3:
    				return (1);
    			case 4:
    				return (1);
    			case 5:///模块
    				return (1);
    			case 6:///模块
    				return (1);
    			case 7:
    				return (1);
    			case 8:
    				return (1);
    			case 9:
    				return (1);
    			case 10:
    				return (1);
    			case 11:
    				return (1);				
    			default:
    				break;
    		}
    	}
    }
    

    block_data_deal 负责执行数据中的命令,完成返回1,未完成返回0,用以顺序执行。
    第一次写稿,只是想表述一种思想,不知道表述清楚与否,欢迎交流扣:50944-2881

    展开全文
  • 获取每一帧长度

    千次阅读 2012-02-08 17:14:19
    论坛搜索帮助导航 ...喝彩奥运bluebrowngraygreengreyish-...H.264乐园 » 如何从H264 ES流中获取每一帧长度?   返回列表发帖 ldf198312 新
    
    
    

    [工程应用] 如何从H264 ES流中获取每一帧的长度?

    将多帧H264编码数据保存到一个文件中,怎么从这个文件中读取每一帧数据?
    或者说,我怎么知道哪个NALU单元是一帧的开始,哪个NALU单元是一帧的结束?
     

     
    slice header 中 first_mb_in_slice = 0,则表示一帧开始
    欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》

    TOP

     
    那什么时候结束呢?
    是不是需要根据下一个first_mb_in_slice=0来判断一帧的结束?

    现在有这样一种应用:VOIP视频电话获取的编码数据是从管道中获取的,在获取的数据可能是一个完整帧,也可能是多个帧,也可能不足一帧。现在需要将数据通过RTP打包发送(一个NALU单元一包),但是不知道什么时候是一帧的结束,也就不能给RTP打上marker位。
    在这种情况下怎么判断帧尾呢?
     

    TOP

     
    目前想到的办法就是根据first_mb_in_slice=0来判断一帧的结束,
    这样在应用中肯定会加大延迟,不过没办法了,编码器接口做的太差了!
     

    TOP

     
    是的。正确做法应该是编码器告诉你什么时候是一帧的结束。如果编码器没有告诉的话那就只有自己从码流中判断了。
    欢迎加入我们的QQ群:12923082。新加入者请先仔细阅读论坛中的《群成员须知》

    TOP

     

    展开全文
  • 并且通信数据严谨的时候,就需要严格的收发每一帧数据来保证可靠性。 本人自己写了一个简单协议,其核心思路如下: 先来说说发送协议: 为了让数据具有可靠性,我在加了帧头的基础上还加了长度校验。并且啃了好久的...

    相信看我文章的你一定是有这个需要点进来的。stm32的串口每次接收一个字符,当我们做任务的时候,可能需要上下位机之间相互通信。并且通信数据严谨的时候,就需要严格的收发每一帧数据来保证可靠性。
    本人自己写了一个简单协议,其核心思路如下:
    先来说说发送协议:
    为了让数据具有可靠性,我在加了帧头的基础上还加了长度校验。并且啃了好久的printf()的写法,学了c语言可变参函数的写法,为了让发送函数适应所有所有数据类型。下面贴出发送函数。
    发送函数:

    void SendChar(uint8_t Data)
    
    {
    
    USART_SendData (USART1 ,Data);                              
    
    while(USART_GetFlagStatus (USART1 ,USART_FLAG_TC )!=SET );  //判断发送是否完成
    
    }
    
    
    /*
    stm32串口发送字符串函数
    */
    
    void SendString(char *str)
    {
     while(*str)             //循环发送  实现字符串的发送
    {
      SendChar(*str);    
      str++;
    }
    }
    
    void Send_Data(char *fmt, ...)      //发送协议
    {
        va_list ap; //初始化指向可变参数列表的指针
        int len=0;   //计算数据长度
        va_start(ap, fmt);         
        vsprintf(send_str, fmt, ap);
        len=strlen(send_str);
        char _data[len+4]; //定义数组来按照协议存放数据;(算上帧头的长度+数据校验位)
        _data[0] = _head_1; // 第一个帧头   宏定义'#'
        _data[1] =_head_2; //第二个帧头 宏定义'@'
        _data[2] =len;    //第三个位本次传输的数据长度
        for (int i = 0; i < len; i++)
        {
            _data[i+3]=send_str[i];  //数据存入发送buffer
    
        }
        _data[len+3]='\0';   //补最后一位‘\0’
        SendString(_data);  //这里调用sendstring; //调用字符串发送
        va_end(ap);                
    }
    
    接收协议:
    
    #include <stdio.h>
    #include "send_data.h"
    #include <stdlib.h>
    #include <string.h>
    #define _head_1 0x23 //帧头'#'
    #define _head_2 0x40 //帧头'@'
    PUartHandle pUartHandle;     //定义的结构体
    void Init_data_array(char *data) //数组初始化
    {
        int i = 0;
        while (data[i++] != '\0')
        {
            data[i] = 0;
        }
    }
    
    void pUartHandle_init(void) //结构体初始化函数
    {
    
        pUartHandle.step = 0;
    
        pUartHandle.tmpCnt = 0;
    
        pUartHandle.aRxBufIndex = 0;
    }
    /*
    接收函数
    第一个参数是接受到的字符,第二个为接受数组
    接受数组需要用户自定义
    且函数放在接受中断里面运行,保证实时性
    */
    void Receive_Data(uint8_t str, char *Data)
    {
    
        switch (pUartHandle.step)
        {
        case 0:
    
            if (str == _head_1) //帧头检验
            {
    
                pUartHandle.step++;
                pUartHandle.aRxBuf_1[pUartHandle.aRxBufIndex++] = str; /*?????*/
            }
            break;
        case 1:
            if (str == _head_2) //第二个帧头检验
            {
                pUartHandle.step++;
                pUartHandle.aRxBuf_1[pUartHandle.aRxBufIndex++] = str;
            }
            else if (str == _head_1) //防止帧头与数据重复
                pUartHandle.step = 1;
            else
            {
    
                pUartHandle_init();  //错误的话,立马初始化结构体,从写一次重新开始接收
            }
    
            break;
    
        case 2:
            if (str == _head_1)
            {
                pUartHandle.step = 1;
                pUartHandle.aRxBufIndex = 1;
            }
            else
            {
    
                pUartHandle.tmpCnt = (int)str; //将数据长度赋值给TMPCNT
                pUartHandle.step++;
                pUartHandle.aRxBuf_1[pUartHandle.aRxBufIndex++] = str;                    /*开始存入数据*/
                if (((RX_BUF_1_LENGTH - pUartHandle.aRxBufIndex) < str) || (str == 0x00)) //防止数据溢出或者收到错误值
                {
    
                    pUartHandle_init();
                }
            }
            break;
    
        case 3:
    
            pUartHandle.aRxBuf_1[pUartHandle.aRxBufIndex++] = str;
            pUartHandle.tmpCnt--;
            if (pUartHandle.aRxBufIndex >= RX_BUF_1_LENGTH)
            {
                pUartHandle_init();
            }
            if (pUartHandle.tmpCnt == 0) //说明接收完成
            {
                strcpy(Data, pUartHandle.aRxBuf_1);
                Init_data_array(pUartHandle.aRxBuf_1); //每收完一帧数据后缓冲区清零。防止溢出
                pUartHandle_init();                    //初始化
            }
    
            break;
    
        default:
            pUartHandle_init();
            break;
        }
    }
    

    相关stm32测试的源代码我会上传至csdn,或者我的github。里面有详细注释。希望和大家一起交流学习。

    展开全文
  • IP协议的数据帧长度是多少?

    千次阅读 2019-04-11 22:07:26
    1、如果使用PPP协议,最大长度1510字节,其中数据长度(加载上层的协议数据)不超过1500字节; 2、如果在以太网中,的长度为:64~1518字节(10~100Mbps 的以太网),1G及以上的以太网,长度为512~1518字节...
  • 录像一帧数据大小

    千次阅读 2016-07-08 15:09:07
    一帧数据:1600*1200*3=5M 不压缩是5M 录像一秒会是15帧或者20帧,这里不压缩就要相乘,一般的不管图片是视频,在传到屏或者存储到本地,生产图片或者视频,头要经过压缩的。 视频的图片的压缩技术分:MPEG 即...
  • 通过串口接受一帧数据请参考的我博客中的文章——教你如何使用stm32接收一帧数据! 一:在.h首先定义一个结构体。 typedef struct { uint8_t H1; uint8_t F1; uint8_t A[7]; uint8_t AN;
  • 串口接收一帧数据及解析

    万次阅读 多人点赞 2018-05-25 11:28:16
    3. 下位机中的数据接收和协议解析 下位机接收数据也有两种方式,、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的篇关于串口通信的文章中详细讨论过。得出...
  • stm32串口中断接收一帧数据

    万次阅读 多人点赞 2017-02-18 17:11:53
    最近用到stm32的串口,中断个字符个字符接收好心累,网上度了一下发现了篇好的...今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数...
  • 好久就想写个东东总结下,但是一直没有时间(都是借口,就是因为懒)。...怎么去判断现在一帧协议收完了呢?也就是说,我要发送一个协议帧,根据协议他是不定长的,怎么判断现在收完了呢? 方法一: ...
  • 串口通信帧的同步方法(识别一帧数据的起始结束)  2012-07-08 23:12:10| 分类: 我的自学实践|举报|字号 订阅   引 言  串口通信是日前单片机和DSP等嵌入式系统...
  • 、 封装数据帧、 二、 "数据帧" 附加信息、 三、 "数据帧" 同步、 四、 "数据帧" 长度、 五、 "数据帧" 组装方法、 六、 透明传输、 七、 字符计数法、 八、 字符填充法 ( 加转义字符 )、 九、 零比特填充法 ( 5...
  • modbus rtu和modbus tcp一帧报文最大长度

    千次阅读 2020-11-06 16:44:28
    早期在RS485串行通信中规定ADU的最大长度为256个字节,其中:通信地址占用1个字节,校验段占用2个字节,所以协议数据单元(PDU)的最大长度为256-1-2=253 字节。而我三弟(Modbus TCP)因为要增加个7个字节的MBAP...
  • YUV2一帧数据大小计算

    千次阅读 2015-05-05 10:29:20
    由于摄像头输出的数据是Y0UY1V的格式,又叫YUV12 这样对于每2个像素就要输出4个字节的数据,Y0UY1V,其中Y0,Y1共用U和V。...所以对于个1024*768的图像实际的YUV数据流大小就为 1024*768*2=1572864
  • 关于STM32串口3的使用,接收并解析一帧数据 当stm32的串口1被使用时,我们可以使用其他串口来使用。 步骤: 串口3定义、初始化; 串口3中断服务函数(接收的一帧数据并判断是否正确); 主函数使用; 首先,我们要将...
  • 当FPGA作为接收端去接收帧数据的时候,即使保证一帧数据的帧头是正确的,而且校验位是正确的也不能百分百保证这帧数据正确接收了,可能情况:1、数据传输有错误,但是错误的数据也得到了一样正确的校验位;...
  • 为什么以太网的最小数据帧长度为64字节? CSMA/CD冲突避免的方法:先听后发、边听边发、随机延迟后重发。一旦发生冲突,必须让每台主机都能检测到。关于最小发送间隙和最小长的规定也是为了避免冲突。 以太网...
  • H.264裸流文件中获取每一帧数据

    千次阅读 2018-07-27 15:54:01
     之前封装了个avc的解码器,想做个测试,读取H.264裸流文件将码流定期定时推送到解码器。  测试其实很简单:  1.了解H.264裸流文件的构成  2.解析H.264裸流文件  3.提取H.264码流调用接口推送数据  1...
  • 大小与帧长度

    万次阅读 2018-03-06 16:33:59
    几乎所有视频编码格式都可以简单的认为一帧就是编码后的一副图像。而音频帧跟音频格式有关,由各个编码标准规定。如果以PCM(未经编码的音频数据)来说,它根本就不需要帧的概念,根据采样率和采样精度就可以播放了...
  • UART判断接收的数据一帧的方法

    千次阅读 2018-07-17 20:44:54
    在总线上接收到数据后,一个字节的时间内没有再接收到数据,空闲标志位置位,便认为一帧接收完毕。如STM32的空闲中断。 延时等待。设定一个超时时间,在总线上接收到数据后,设定时间内没有再接收到数据,认为一帧...
  • 一帧数据多次接受处理方法在使用Qt自带的串口QtSerialPort时。其发送过来的数据需要进行接受,则需要连接一个相应的槽函数: //连接槽函数,当有串口数据来时,进入槽函数。 connect(serial,SIGNAL(readyRead()),...
  • (2012年联考) 两台主机之间的数据链路层采用了后退N协议(GBN)传输数据数据的传输速率为16kbps,单向传播时延为270ms,数据帧长度范围是128~512字节,接收方总是以数据帧等长的进行确认(即确认帧长度与发送...
  • 2、帧起始定界符:1字节0xD5(10101011),表示一帧开始 3、DA(目的MAC):6字节 4、SA(源MAC):6字节 5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF) 6、数据:46~1500...
  • 串口通信是日前单片机和DSP等嵌入式系统之间,以及嵌入式系统与PC机或无线模块之间的种非常重要且普遍使用的通信方式在嵌入式系统的硬件结构中,通常只有个8位或16位的CPU,不仅要完成主流程的工作,同时...
  • 以太网帧长度大小限制

    千次阅读 2019-03-31 17:22:37
    表示以太网传输的最大帧长度。 为什么要有最大帧长度限制呢? 这是因为以太网采用的是CSMA/CD方法在介质上传输数据。CSMA/CD叫做带冲突检测的载波监听多路访问技术,在发送数据之前需要检测链路是否空闲,只有链路...
  • 以太网数据帧(802.3)最大与最小长度

    万次阅读 多人点赞 2017-03-20 19:40:01
    2、帧起始定界符:1字节0xD5(10101011),表示一帧开始 3、DA(目的MAC):6字节 4、SA(源MAC):6字节 5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留为类型域值(0x0600~0xFFFF) 6、数据:46~1500...
  • 在调试程序时发现,甲方提供的通信协议,只有头和信息位,没有尾,...000,设备可以正常接收,但在尾部添加个字节或者减少个字节再发送,设备依然响应。 以下为错误的代码。 // if(USART_GetITStatus(...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 114,983
精华内容 45,993
关键字:

一帧数据长度