最近的项目中,涉及到了串口通信的知识,然后其中要传递一个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);
One comment
阿里云测试