Angel丶奏弦ʕ๑•ɷ•๑ʔ 2022-12-28 21:05 采纳率: 33.3%
浏览 120
已结题

关于#qt#的问题:用QT进行下图所示程序编写(用C++)

用QT,C++语言进行下图所示程序编写,需要分成main,packunpack,widgt三个cpp文件需要完整的编码过程,具体过程或如果有文件,都可上传。用C++写代码,图1为要求,图2为示例

img

img

img

  • 写回答

4条回答 默认 最新

  • qfl_sdu 2022-12-29 15:59
    关注

    img

    代码如下:

    #define _CRT_SECURE_NO_WARNINGS 1
    
    
    
    //模块ID(1字节)
    //数据头(1字节,包含6个数据的bit0+二级IDbit0,顺序从高到低依次为:数据1bit0 数据2bit0....二级IDbit0,最高位bit7=1)
    //二级ID(1字节,bit0置1)
    //数据6字节(bit0置1)+干扰码6字节(交替排列)
    //校验码(1字节)(数据高7位和,包括模块ID高7位+二级ID高7位+数据头高7位)
    //总长度4+12=16个字节
    
    #include <iostream>
    #include <string>
    using namespace std;
    /**@brief 编码
      @param[in] modId 模块ID
      @param[in] subId 二级ID
      @param[in] 6字节数据
      @param[in] 6字节干扰码
      @return 编码后的字符串
      */
    char* enCode( char modId, char subId, char data[], char gr[] )
    {
        int k = 0;
        char* package = new char[17];
        package[16] = 0; 
    
        //模块ID
        package[0] = modId;
    
        //数据头
        char t = 0x80; 
        char m;
        //1.拼接6个数据的bit0
        for (int i = 0; i < 6; i++)
        {
            m = (data[i] & 0x01);//得到data[i]的bit0
            m = m << (6 - i);    //m左移6-i位
            t += m;
        }
        //2.拼接二级ID 的bit0
        m = (subId & 0x01);
        t += m;
        package[1] = t;
    
        //二级ID
        package[2] = subId | 0x01; //二级ID的bit0置1
    
        //数据+干扰码
        k = 3;
        for (int i = 0; i < 6; i++)
        {
            m = data[i] | 0x01; //数据的bit0置1
            package[k++] = m;
            package[k++] = gr[i]; //干扰码
        }
    
        //校验码 package[15] = (模块ID的高7位+二级ID的高7位+数据头的高7位之和)
        char p7 = modId & 0xfe; //提取模块ID的高7位
        char p6 = subId & 0xfe; //提取二级模块的高7位
        char p5 = package[1] & 0xfe; //数据头的高7位
    
        p7 = p7 >> 1; //右移1位
        p6 = p6 >> 1;
        p5 = p5 >> 1;
    
        package[15] = p7 + p6 + p5;
    
        return package;
    }
    
    /**@brief 解码
       @param[in] package 需要解码的报文
       @param[out] modID 模块ID
       @param[out] subID 二级ID
       @param[out] data 6字节数据
       @param[out] gr 6字节干扰码
       @return 解码成功返回1,否则返回0
      */
    int deCode(const char* package, char* modId, char* subId, char data[], char gr[])
    {
        if (strlen(package) != 16) //报文长度16
            return 0;
    
        
        *modId = package[0];  //模块ID
        *subId = package[2] & 0xfe;  //二级ID,bit0置0
        char head = package[1]; //数据头
        *subId = (*subId) | (head & 0x01);//head的bit0是二级ID的bit0
    
        head = head>> 1; //右移1位,因为原来最后1位是二级ID的bit0
        //数据部分
        int k = 14;
        for (int i = 5; i >= 0; i--)
        {
            gr[i] = package[k--];
            data[i] = package[k--] & 0xfe; //将data[i]的bit0置0
            char t = head & 0x01; //得到最后1位
            data[i] = data[i] | t; //修正data[i]的bit0
            head = head >> 1;
        }
        return 1;
    }
    
    
    int main()
    {
        char data[] = {0x00,0x01,0x6E,0x01,0x70,00};
        char gr[] = { 0xfe,0xfe,0xfe,0xfe,0xfe,0xfe };
        char modId = 0x12;
        char subId = 0x02;
        char* p = enCode(modId, subId, data, gr);
        printf("模块ID:%02x,二级ID:%02x,", modId & 0xff, subId & 0xff);
        cout << "原数据:" ;
        for (int i = 0; i < 6; i++)
        {
            printf("%02x ", data[i] & 0xff);
        }
        cout << "\n编码后:" << endl;
        for (int i = 0; i < 16; i++)
        {
            char t = p[i];
            printf("%02x ", (t & 0xff));
        }
    
        //
        cout << "\n解码后:" << endl;
        char mid = 0, sid = 0, dt[7] = { 0 }, gg[7] = { 0 };
        deCode(p, &mid, &sid, dt, gg);
        printf("模块ID:%02x\n", mid);
        printf("二级id:%02x\n", sid);
        printf("数据:");
        for (int i = 0; i < 6; i++)
            printf("%02x ", dt[i] & 0xff);
        return 0;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 1月9日
  • 已采纳回答 1月1日
  • 修改了问题 12月29日
  • 修改了问题 12月28日
  • 展开全部

悬赏问题

  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果