历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2019年02月19日 | STM32学习笔记9——结构体赋值问题

2019-02-19 来源:eefocus

采用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;

}


推荐阅读

史海拾趣

Gold Peak Group公司的发展小趣事
对操作人员进行必要的培训,使其了解控制电路的工作原理、操作方法和安全注意事项。
Echelon_Corporation公司的发展小趣事

作为一家技术驱动的公司,Echelon始终注重技术创新和产品研发的投入。公司拥有一支专业的研发团队,致力于开发更加先进、更加可靠的产品和技术。同时,Echelon还积极与全球范围内的科研机构、高校等合作,共同推动技术创新和产业升级。这些努力使得Echelon在电子行业始终保持领先地位。

Cermetek Microelectronics公司的发展小趣事

随着产品的推出,Cermetek Microelectronics公司开始注重品质管理。公司建立了严格的质量控制体系,从原材料采购到生产流程,再到最终的产品测试,都经过严格的把控。这种对品质的执着追求,使得公司的产品在市场上获得了良好的口碑。同时,公司还积极拓展市场,与多家知名企业建立了合作关系,进一步提升了品牌影响力。

Excel-Display Corporation公司的发展小趣事

EDC一直将产品质量视为企业的生命线。为了确保产品质量,公司建立了严格的质量管理体系,从原材料采购到生产过程中的每一个环节都进行严格的质量控制。

此外,EDC还注重售后服务,为客户提供全方位的技术支持和解决方案。这些举措让EDC赢得了客户的信赖和好评,也为公司赢得了更多的市场份额。

Frolyt Condensers & Elements GmbH公司的发展小趣事

随着全球对环保问题的日益重视,Frolyt Condensers & Elements GmbH积极响应号召,将环保理念融入产品设计和生产流程中。公司投入大量资金研发环保型电容器材料和生产工艺,成功推出了多款低能耗、无污染的电容器产品。这些产品不仅满足了市场对环保产品的需求,还帮助Frolyt树立了良好的企业形象,进一步提升了市场竞争力。

东晨(DC)公司的发展小趣事

东晨(DC)公司深知人才是企业发展的核心动力。因此,公司高度重视人才培养和引进工作。公司建立了完善的培训体系,为员工提供全面的职业发展和技能培训。同时,公司还积极引进优秀人才,通过股权激励等措施留住人才。这些措施为公司的持续发展提供了有力的人才保障。

问答坊 | AI 解惑

基于16位单片机的逆变电源系统的设计

摘要:介绍了一种以8XC196MC为内核的逆变电源系统。其逆变控制系统实现了全数字操作。逆变部分的SPWM控制脉冲波形完全由8XC196MC单片机生成,使用IR2130实现对功率管的驱动和保护,频率电压可由数码管显示,可用串口与上位机进行通讯.该系统硬件电路简 ...…

查看全部问答>

谈谈CT球管的换油技术(转)

CT球管经过多次曝光后,球管中的油会发生变质,其绝缘性和冷却能力都已降低,直接影响球管的使用寿命。我们对CT球管进行清洗、换油,大大的延长CT球管的使用寿命,现将经验介绍如下: 材料和方法:抽真空机一台,负压表一只,真空自动加油缓冲器一 ...…

查看全部问答>

如何将AD采集的信号缩小以适应AD芯片

我要采集的信号是5V左右,但是我用的AD芯片TLC5510的输入信号范围是0.6~2.6V。我想将采集信号进行缩小后再采集。当然直接电阻分压肯定是不行的吧。哪位大侠指教一下。也考虑过用电阻分压后,再用射级跟随器减小输入阻抗, 这样是否可行?…

查看全部问答>

2440串行通信 程序跑飞

为什么加上rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 );程序就会跑飞?…

查看全部问答>

WinCE开发都必备哪些软件啊?

我是一名新手,做毕业设计要用WinCE,和看了几天WinCE了,可就是入不了门,而且现在有一个大问题,不知都用什么软件。 现在了解到要装Platform Builder 5.0; 还要用到Visual Studio 2005/2008或EVC++ 还听说要用ADS1.2 还要用到ActiveSync ...…

查看全部问答>

控制LED的开启

void led_on(void) {         int i,        nOut;         nOut = 0xF0;                            & ...…

查看全部问答>

s3c2440 + wince休眠唤醒的问题

下面是nboot(steldr——boot)里关于休眠唤醒的处理代码 WAKEUP_POWER_OFF     ; Release SCLKn after wake-up from the POWER_OFF mode.     ldr                r1, =MISCCR & ...…

查看全部问答>

WinCE启动步骤第一步疑问

The process of changing an EXE or DLL program file after it has been loaded to reflect the actual load address is called “fixing up”. 哪位朋友能帮我解释下这个fix up的意思么? 还有这样一句: kernel.dll is also ‘fixed up’ by ...…

查看全部问答>

飞凌2440,usb下载wince6.0启动后白屏

wince5.0和linux都没问题。。。。。。我按照飞凌提供的手册,eboot.nb0飞凌提供的是wince5.0的。NK.bin是wince6.0的。。。。。。。。结果烧写后启动白屏然后断电重启后bootload都要重新烧写,每次都这样。。。有人知道什么问题吗,谢了…

查看全部问答>

低功耗Wi-Fi:如何优化应用的功耗

你想不想知道在应用中如何实现低功耗Wi-Fi®?我们的SimpleLink™ Wi-Fi 器件系列提供易于使用且高效的方法来优化应用功耗,从而实现更长的产品使用寿命。请继续往下读,看看我们是如何实现的。Wi-Fi是目前最普遍的无线互联网连通性技术。 ...…

查看全部问答>