写入串口时Qt崩溃

时间:2016-01-10 17:36:52

标签: c++ qt serial-port

嗨我在QT中有一个程序,每当我写入串口时,它似乎都会崩溃。我使用的是Mac OSx 15英寸视网膜。以下是相关代码:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    //set central widget for the Main Window
    centralWidget = new QWidget(this);
    this->setCentralWidget(centralWidget);

    //creation and attribution of slider
    slider = new QSlider();
    slider->resize(255, 20);
    slider->setOrientation(Qt::Horizontal);
    slider->setRange(0, 255); //0-255 is range we can read

    //layout with slider and lcd
    main_layout = new QVBoxLayout();
    main_layout->addWidget(slider);

    //set layout to the widget inside MainWindow
    centralWidget->setLayout(main_layout);

    /*Connection Events*/
    //connection between the slider event and the transmission function
    QObject::connect(slider, SIGNAL(valueChanged(int)), this, SLOT(transmitCmd(int)));
}

void MainWindow::init_port()
{
    port = new QSerialPort("COM3");     //create port

    port->open(QIODevice::ReadWrite | QIODevice::Unbuffered); //open port
    if(!port->isOpen())
    {
        QMessageBox::warning(this, "port error", "Can't open port!");
    }

    //set port properties
    port->setBaudRate(QSerialPort::Baud9600); //9600 FOR ARDUINO
    port->setFlowControl(QSerialPort::NoFlowControl);
    port->setParity(QSerialPort::NoParity);
    port->setDataBits(QSerialPort::Data8);
    port->setStopBits(QSerialPort::OneStop);
}

void MainWindow::transmitCmd(int value)
{
    //if value wasn't between 0-255, no transmission
    if(value < 0 || value > 255)
        return;
    char *buffer = (char*) new int(value);

    //send buffer to serial port
    port->write(buffer);
}

它在线路端口 - >写入(缓冲区)崩溃。我正在使用QT 5.5并使用QTSerialPort。

2 个答案:

答案 0 :(得分:1)

尝试

port->write (buffer, sizeof (int));

你使用了QIODevice::write(const char* data)重载,它需要一个以空字符结尾的字符串(你的缓冲区不是')。很自然地,io设备不知道何时停止......

这应该可以解决你的崩溃问题。顺便说一下,同样可以说:

port->write (reinterpret_cast<const char*> (&value), sizeof (int))

但是,请注意,上面的两个命令都会在您的端口上发送4个字节(sizeof int)的数据(按系统的字节顺序,可能是little-endian)。也许(从你的功能开始时的0-255检查来判断),这实际上并不是你想要的。如果您只想发送一个字节:

unsigned char valueCh = static_cast<unsigned char> (value);
port->write (reinterpret_cast<const char*> (&valueCh), 1)

<强>附录:

正如您所写,您只是忘记了初始化呼叫。好抓@perencia!但是仍然值得理解为什么你的transmitCmd()确实有效 - 因为乍一看它不应该。

我仍然坚持认为你使用了错误的write()电话 - 但事实上,它仍然有用。会发生什么:

我们说value == 17。然后,在little-endian架构上,缓冲区如下所示:

// "17" little-endian
11 00 00 00
^
|
buffer

并且您对write(buffer)的调用将看到您要发送的正确数据字节,后跟一个nul-byte,导致它停止。

答案 1 :(得分:0)

您没有致电init_port。至少在您提交的代码中。