最近的项目中,涉及到了串口通信的知识,然后其中要传递一个unsigned char类型的数组,写了如下的代码:

  unsigned char msg[6];

    msg[0] = 0x02; // 帧头
    msg[1] = this->id;  //地址
    msg[2] = 0x52;  //命令
    msg[3] = tmp.c1;  //校验码高位
    msg[4] = tmp.c2;  //校验码低位
    msg[5] = 0x03;  //帧结束

    WriteMsg tMsg;
    tMsg.data = msg;
    tMsg.len = 6;
    serialPort->sendData(tMsg);

sendData(WriteMsg msg);
这个函数是把上面的msg给送到一个队列里面去,然后通过另外一个线程来发送,结果最后发送过去的数据全是0...

直接就懵逼了....找了很久没找着原因,最后还是请教了学长,然后发现这段代码犯了很低级的错误~

那就是栈内存的生命周期,一个函数里面的变量生命周期局限于当前函数的生命周期,在当前的这个函数结束后,那么在它这个代

码块的变量都会被释放,且数据会发生变化(初始化?).最终还算是运气好,提前找到了bug吧..

怎么改呢,那就是手动申请内存空间了.

  unsigned char *msg = new unsigned char [6];

    msg[0] = 0x02; // 帧头
    msg[1] = this->id;  //地址
    msg[2] = 0x52;  //命令
    msg[3] = tmp.c1;  //校验码高位
    msg[4] = tmp.c2;  //校验码低位
    msg[5] = 0x03;  //帧结束

    WriteMsg tMsg;
    tMsg.data = msg;
    tMsg.len = 6;
    serialPort->sendData(tMsg);
最后修改:2019 年 10 月 11 日
如果觉得我的文章对你有用,请随意赞赏