最近的项目中,涉及到了串口通信的知识,然后其中要传递一个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);
Last modification:October 11, 2019
If you think my article is useful to you, please feel free to appreciate