错误提示:
Signal received
The inferior stopped because it received a signal from the Operating System.
Signal name : SIGSEGV
Signal meaning : Segmentation fault
这个错误说明程序中有野指针,断点以下很容易找出错误。
代码分析:
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
InitPort();
InitTcp();
ui->SendBtn->setEnabled(false);
}
//初始化
void Widget::InitPort()
{
mySerial = new QSerialPort(this);
foreach (const QSerialPortInfo&info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->ComBC->addItem(info.portName());
serial.close();
}
}
QStringList baudList;//波特率
baudList<<"115200"<<"57600"<<"38400"<<"19200"<<"9600"<< "4800"<<"2400"<<"1200";
ui->BaudCB->addItems(baudList);
QStringList dataBitsList;
dataBitsList<<"8"<<"7"<<"6"<<"5";
ui->DataBitsCB->addItems(dataBitsList);
QStringList parityList;
parityList<<"无校验"<<"奇校验"<<"偶校验";
ui->ParityCB->addItems(parityList);
QStringList stopBitsList;
stopBitsList<<"1"<<"1.5"<<"2";
ui->StopCB->addItems(stopBitsList);
QStringList setFlowCtrl;
setFlowCtrl<<"off"<<"RTS/CTS"<<"XON/XOFF";
ui->FlowsCB->addItems(setFlowCtrl);
//ui->SendBtn->setEnabled(false);
}
//配着上面的错误信息看哦,代码比较多,贴出来的是出现上面问题的代码,错误根源再int ret= mySerial->write(ch);
void Widget::doProcessWrite()
{
if(!tempStr.isEmpty())
{
//qDebug()<<"向串口写入数据正确";
char *ch=tempStr.data();
int ret= mySerial->write(ch);
if(ret<0)
{
return;
}
}
else{
//qDebug()<<"向串口写入数据错误";
return;
}
QString str=QString::fromLocal8Bit(tempStr);
QString strReplace= str.replace(QString("\r\n"),QString(""));
if(!strReplace.isEmpty())
{
ui->textEdit_Client->append(strReplace);
qDebug()<<strReplace;
}
else {
return;
}
tempStr.clear();
}
原因:开始的时候是在某个槽函数中mySerial = new QSerialPort(this)分配空间的,如果这个槽函数没有执行就不会分配空间;所以就会出现野指针情况,对于这种情况应该检查指针是否new个空间,所以最好在初始化的时候就要为指针申请空间。