MFC笔记

本文介绍了C语言中结构体的字节对齐问题,通过实例展示了字节对齐的计算,并探讨了MFC在设置时间权限、多线程和串口通信中的注意事项,包括UpdateData()可能导致的崩溃、Format函数的使用以及解决串口打印中文乱码的方法。

#include <stdio.h>
#include <stdint.h>


struct {
    char a;  
    short b;
    int c;
}buf;


int main(void) {
    printf("%d",sizeof(buf));
    return 0;
}

结果为8,因为有效对齐值N是最终用来决定数据存放地址方式的值。有效对齐N表示“对齐在N上”,即该数据的“存放起始地址%N=0”。而数据结构中的数据变量都是按定义的先后顺序存放。第一个数据变量的起始地址就是数据结构的起始地址。结构体的成员变量要对齐存放,结构体本身也要根据自身的有效对齐值圆整(即结构体成员变量占用总长度为结构体有效对齐值的整数倍)。

C语言字节对齐问题详解 - clover_toeic - 博客园

2.

#include <stdio.h>
#include <string.h>
//#define
union seat{
    struct {
        unsigned char type;    //0x01:ZIGBEE 振动传感器
        unsigned char channel; //传感器通道号(该字段作为Zigbee的本机地址)(默认1)
        unsigned short panId;  //Zigbee通讯参数-PANID(默认1)
        unsigned char  freqBand; //Zigbee通讯参数-频段(默认11)
        unsigned char  txPower;  //Zigbee通讯参数-发送功率(默认4dbm)
        float accCoe;            //加速度灵敏度系数
        char sn[10];           //传感器序列号“0000180001”
        char mainVersion[8];   //传感器主板硬件版本号“V1.24”
        char sampleVersion[8]; //传感器采集板硬件版本号“V1.21”
        char name[15];         //传感器蓝牙名称
        unsigned char model[2];  //传感器型号
        unsigned char keep[128]; //预留
        char softVersion[10];    //版本
    }__attribute__((packed)) data;
    
    unsigned char buf[191];
}Fifo;


int main()
{
       unsigned char source[]={0x01,0x01,0x0A,0x00,0x0B,0x00,
0x00,0x00,0x80,0x3F,0x32,0x33,0x33,0x31,
0x31,0x00,0x00,0x00,0x00,0x00,0x56,0x31,0x2E,0x36,0x00,0x00,0x00,
0x00,0x56,0x31,0x2E,0x30,0x00,0x00,0x00,0x00,0x44,0x54,0x5F,0x5A,
0x42,0x5F,0x32,0x33,0x33,0x31,0x31,0x00,0x00,0x00,0x00,0x00,0x02,
0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x31,
0x31,0x31,0x2E,0x39,0x00,0x00,0x00,0x00};
                             
   memcpy((char*)Fifo.buf,(char*)source,sizeof(Fifo));//内存拷贝函数
   
   for(int i=0;i<sizeof(Fifo.data.name);i++)
     printf("%c ",Fifo.data.name[i]);

   return 0;
}

3.MFC SetLocalTime()设置时间不成功主要是程序权限不够,在vs中

(项目右键---属性---连接器---清单文件---uac执行级别 选择requireAdministrator )中文版

(project->property->Configuration Properties->Linker->Manifest File->UAC  Execution Level 选择requireAdministrator)英文版

重新编译 这样你的程序直接运行就拥有管理员权限了。 

4.MFC多线程中运行UpdateData()会让程序崩溃;

 5.Fomat使用格式化转换要注意。

6.MFC串口打印中文乱码问题,直接Format()无法打印成功。通过BYTE->char->CString 解决。
    VARIANT variant_input;
    COleSafeArray safearray_inp;
    //    COleVariant myVar;
    LONG len, k;
    BYTE rxdata[4096] = {0}; //设置BYTE数组 An 8-bit integerthat is not signed.
    /*CString strtemp;*/
    CString swit;

    if (m_Lock == false)
    {
        /*Sleep(500);*/
        m_Lock = true;
        if (m_mscom.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
        {////////以下你可以根据自己的通信协议加入处理代码

            variant_input = m_mscom.get_Input(); //读缓冲区
            safearray_inp.Attach(variant_input); //VARIANT型变量转换为ColeSafeArray型变量
            len = safearray_inp.GetOneDimSize(); //得到有效数据长度
        
            for (k = 0; k < len; k++)
                safearray_inp.GetElement(&k, rxdata + k);//转换为BYTE型数组

            //这样才能显示中文
            CString *p = new CString((char*)rxdata, len);
            swit = *p;

        
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值