STM32学习笔记9——结构体赋值问题
2017-08-29 10:37
411 查看
采用TCP/IP上报采集数据,用结构体的形式建立数据缓冲区。在对结构体整体赋初值(比如帧头之类的可以先赋值)时,发现结构体只能在定义时整体赋初值,而不能在初始化语句中赋。
比如我定义的结构体为:
//帧格式结构体
typedef struct
{
uint32_t frame_head; //帧标志
uint16_t frame_len;//帧长
stcSystemTime frame_time;//帧时间
stcFrameParameter frame_parameter;//参数列表
uint8_t frame_head_check;//帧头校验码
uint8_t frame_total_check;//整帧校验码
stcADSData frame_data[CHANEL_NUM][CHANEL_DATA_NUM];//帧数据
}stcDataFrame;
可以这样在定义时赋初值:
stcDataFrame TCPTxBuff[TX_BUFF_SIZE] ={0} ;
当然,也可以写成{0,0,0,....}之类的形式,对结构体中的每个元素分别赋初值。
但是,下面的做法错误,会报错。即使对每个结构体中的元素分别赋值(采用{0,0,0.....}的形式)也是错的。
void Sys_InfoInit( void )
{
//2路数据缓冲初始化
TCPTxBuff[0] = {0};
TCPTxBuff[1] = {0};
return;
}
如果在定义时没有赋初值,初始化还是要老实地对每个元素赋值,如下:
void Sys_InfoInit( void )
{
uint16_t i = 0;
uint16_t j = 0;
uint16_t k = 0;
//2路数据缓冲初始化
for( i = 0; i <= TX_BUFF_SIZE-1; i++ )
{
TCPTxBuff[i].frame_head = TX_FRAME_HEAD_LE; //STM32是小端模式
TCPTxBuff[i].frame_len = TX_FRAME_LEN_LE;
TCPTxBuff[i].frame_time.year = 0;//时间
TCPTxBuff[i].frame_time.month = 0;
TCPTxBuff[i].frame_time.day = 0;
TCPTxBuff[i].frame_time.hour = 0;
TCPTxBuff[i].frame_time.minute = 0;
TCPTxBuff[i].frame_time.second = 0;
TCPTxBuff[i].frame_time.milsecond_high = 0;
TCPTxBuff[i].frame_time.milsecond_low = 0;
TCPTxBuff[i].frame_parameter.device_type = 1;//设备类型
TCPTxBuff[i].frame_parameter.data_resolution = 24;//采样精度
TCPTxBuff[i].frame_parameter.data_len = CHANEL_DATA_NUM_LE;//数据长度
TCPTxBuff[i].frame_parameter.data_width = CHANEL_NUM;//数据宽度
TCPTxBuff[i].frame_parameter.frame_num = 0;//帧计数
TCPTxBuff[i].frame_parameter.reserve1 = 0;//保留1
TCPTxBuff[i].frame_parameter.reserve2 = 0;//保留2
TCPTxBuff[i].frame_head_check = 0;//帧头校验码
TCPTxBuff[i].frame_total_check = 0;//整帧校验码
for( j = 0; j <= CHANEL_NUM - 1; j++ )//数据
{
for( k = 0; k <= CHANEL_DATA_NUM - 1; k++ )
{
TCPTxBuff[i].frame_data[j][k].byte1 = 0;
TCPTxBuff[i].frame_data[j][k].byte2 = 0;
TCPTxBuff[i].frame_data[j][k].byte3 = 0;
}
}
}
return;
}
比如我定义的结构体为:
//帧格式结构体
typedef struct
{
uint32_t frame_head; //帧标志
uint16_t frame_len;//帧长
stcSystemTime frame_time;//帧时间
stcFrameParameter frame_parameter;//参数列表
uint8_t frame_head_check;//帧头校验码
uint8_t frame_total_check;//整帧校验码
stcADSData frame_data[CHANEL_NUM][CHANEL_DATA_NUM];//帧数据
}stcDataFrame;
可以这样在定义时赋初值:
stcDataFrame TCPTxBuff[TX_BUFF_SIZE] ={0} ;
当然,也可以写成{0,0,0,....}之类的形式,对结构体中的每个元素分别赋初值。
但是,下面的做法错误,会报错。即使对每个结构体中的元素分别赋值(采用{0,0,0.....}的形式)也是错的。
void Sys_InfoInit( void )
{
//2路数据缓冲初始化
TCPTxBuff[0] = {0};
TCPTxBuff[1] = {0};
return;
}
如果在定义时没有赋初值,初始化还是要老实地对每个元素赋值,如下:
void Sys_InfoInit( void )
{
uint16_t i = 0;
uint16_t j = 0;
uint16_t k = 0;
//2路数据缓冲初始化
for( i = 0; i <= TX_BUFF_SIZE-1; i++ )
{
TCPTxBuff[i].frame_head = TX_FRAME_HEAD_LE; //STM32是小端模式
TCPTxBuff[i].frame_len = TX_FRAME_LEN_LE;
TCPTxBuff[i].frame_time.year = 0;//时间
TCPTxBuff[i].frame_time.month = 0;
TCPTxBuff[i].frame_time.day = 0;
TCPTxBuff[i].frame_time.hour = 0;
TCPTxBuff[i].frame_time.minute = 0;
TCPTxBuff[i].frame_time.second = 0;
TCPTxBuff[i].frame_time.milsecond_high = 0;
TCPTxBuff[i].frame_time.milsecond_low = 0;
TCPTxBuff[i].frame_parameter.device_type = 1;//设备类型
TCPTxBuff[i].frame_parameter.data_resolution = 24;//采样精度
TCPTxBuff[i].frame_parameter.data_len = CHANEL_DATA_NUM_LE;//数据长度
TCPTxBuff[i].frame_parameter.data_width = CHANEL_NUM;//数据宽度
TCPTxBuff[i].frame_parameter.frame_num = 0;//帧计数
TCPTxBuff[i].frame_parameter.reserve1 = 0;//保留1
TCPTxBuff[i].frame_parameter.reserve2 = 0;//保留2
TCPTxBuff[i].frame_head_check = 0;//帧头校验码
TCPTxBuff[i].frame_total_check = 0;//整帧校验码
for( j = 0; j <= CHANEL_NUM - 1; j++ )//数据
{
for( k = 0; k <= CHANEL_DATA_NUM - 1; k++ )
{
TCPTxBuff[i].frame_data[j][k].byte1 = 0;
TCPTxBuff[i].frame_data[j][k].byte2 = 0;
TCPTxBuff[i].frame_data[j][k].byte3 = 0;
}
}
}
return;
}
相关文章推荐
- STM32学习笔记10——stm32中结构体字节对齐问题
- 数据结构 学习笔记之:结构体及其所定义变量的内存分配的问题
- php学习笔记之list()赋值问题及each()结合遍历
- 【STM32学习笔记】软件使用---win10下 keil5打开keil4工程的问题
- STM32学习笔记——AFIO时钟的配置问题
- stm32学习笔记----双串口同时打开时的printf()问题
- (学习笔记)C++底层dll C#调用问题汇总:结构体的不同之处
- php学习笔记之list()赋值问题及each()结合遍历
- C语言学习笔记(结构体对齐问题)
- 做个笔记——C语言结构体成员赋值的一个小问题
- STM32学习笔记8——串口输出数据丢失问题
- 学习拾遗--用RadioButtonList 或者DropDownList 进行动态赋值问题
- 学习笔记:处理表单提交的中文乱码问题
- java基础学习笔记原始类型变量赋值与非原始变量赋值
- XSL学习笔记:XSLT优先级问题
- 关于asp.net 2.0 入门学习之“GlobalResources与Callback问题”的笔记
- moss2007学习笔记之三,我又遇到了新问题!!
- Effective C++学习笔记:尽量使用初始化而不要在构造函数里赋值
- XSL学习笔记:XSLT优先级问题
- debian学习笔记--解决挂载分区中出现乱码问题