家里的树莓派3B闲置了N久,于是JD上下单买了个10寸高清 树莓派 液晶显示器,今天东西到货了,这是要花钱逼自己玩起来的节奏,要不,就用Qt实现一个串口通信程序吧,[做姚明之苦笑状]…..

准备工作

开启树莓派3B的串口支持

对于Mathematica粉丝来说,系统自然要选raspbian了,谁叫Mathematica只在该系统免费捆绑发布。另外,新版本的raspbian可以通过界面配置就能开启,网上目前充斥的很多文章都讲的是 怎么替换掉蓝牙的冲突串口,要费点事。

rasp_config.png

现存的串口工具

Linux下必然首推screen。windows下就用putty吧。

自己造轮子

使用Qt/QSerialPort

本着练手解闷的目的,写了点代码,主要实现文件只有100行左右:
https://github.com/cymatics1717/demoQtSerial
这里面还是有好几个细节上的坑的,只有亲自动手做的人才能GET的到。不赘言。

  • 基本功能
    可以枚举设备,连接,发送和接受数据指令。具备历史记录功能。
  • 软件质量
    保证不崩溃。即在断开连接,重复拔插,重复打开的情况下依然能正常使用。
    具备错误反馈。捕捉所有错误信息。
    示例代码,打开:
    void MainWindow::openPort()
    {
    enumSerials();

    QString status;
    if(serial_lst.size()==0){
    status = "no available serial port";
    } else if(ui->pushButton->text()=="Open"){
    if(serial.isOpen()) serial.close();
    auto port = serial_lst.at(ui->comboBox->currentIndex());
    serial.setPort(port);
    serial.setBaudRate(ui->comboBox_2->currentText().toInt());
    if(serial.open(QIODevice::ReadWrite)){
    // serial.setBaudRate(QSerialPort::Baud115200);
    // serial.setDataBits(QSerialPort::Data8);
    // serial.setParity(QSerialPort::NoParity);
    // serial.setStopBits(QSerialPort::OneStop);
    // serial.setFlowControl(QSerialPort::NoFlowControl);
    ui->pushButton->setText("running");
    writeData();
    status = QString("current: %1:%2 %3\t\t%4 %5 [%6:%7]").arg(port.description())
    .arg(port.portName()).arg(port.manufacturer())
    .arg(port.serialNumber()).arg(port.systemLocation())
    .arg(port.productIdentifier(),4,16,QChar('0'))
    .arg(port.vendorIdentifier(),4,16,QChar('0'));
    } else {
    status = QString("open failed %1:%2").arg(serial.error()).arg(serial.errorString());
    }
    }
    statusBar()->showMessage(status);

    }

3B.png