在写QT软件时,使用QByteArray来进行串口数据发送时,碰到如下报错问题:
(1)Invalid parameter passed to C runtime function;
(2)Q_ASSERT(size == 0 || offset < 0 || size_t(offset) >= sizeof(QArrayData));
经过查找资料问题原因可能是:
问题1原因:调用函数是传递了空指针,有个空指针或者无效的野指针在操作;
问题2原因:QByteArray的大小size=0或偏移offset<0或size_t(offset) >= sizeof(QArrayData);
进入调试模式,发现数据字节变量定义的数据类型为quint8,最大值为255,而实际需要发送的一包数据最大会是超过498个字节,问题就出在变量的数据类型定义与赋值溢出这里,因此需将数据字节变量的数据类型定义为quint16:
1、数据字节变量及发送缓存定义
QByteArray sendData;
quint8 mid_u16DatBytes = 0;
2、数据字节变量操作及发送缓存大小设置
执行完上图第1句时变量值为:
发送缓存大小设置完后如下图,可见sendData为空:
总结:
由上述可知,报上述两种错误时,可好好查一下对QByteArray的操作特别是大小定义这块是否有问题,为了提高代码的健壮性,同时建议可在对QByteArray进行操作和定义大小时,可先判断一下QByteArray的大小是否为0或越界操作。如上述代码可修改为:
mid_u16DatBytes = m_u16LoraPacketDatByteNum + 14;
if(mid_u16DatBytes > 0)
{
sendData.resize(mid_u16DatBytes);
if(mid_u16DatBytes < 本帧数据应发数据字节数)
{ sendData[8] = (u8)(m_u16LoraPorgDatPacketIndex >> 8); ……}
}
else
//报错或其他处理