簡體   English   中英

寫入串行端口時Qt崩潰

[英]Qt crashing when writing to 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);
}

它在端口port-> write(buffer)上崩潰。 我正在使用QT 5.5和QTSerialPort。

嘗試

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 然后,在小端架構上,您的緩沖區如下所示:

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

並且您對write(buffer)的調用將看到您要發送的正確數據字節,然后是一個nul字節,這將使其停止。

您沒有在調用init_port 至少在您提交的代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM