基于惠斯通电桥原理实现精确测量电阻的方案
首先上位机和下位机实现通信才能实现上位机对下位机的控制,这个通信的实现就要利用串口通信。在上位机方面我们使用了QT自带的串口通信模块QSerialPort和QSerialPortinfo。这两个模块结合个可以创建一个串口对象,软件对串口的全部操作都是基于这个串口对象。
-
首先创建一个串口对象:
QSerialPort serial; // 全局串口对象
-
在创建一个串口对象之后首先要在计算机中查找可用的端口。实现部分如下:
void Test::findSerial() // 查找计算机可用串口 { foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { QSerialPort tempSerial; tempSerial.setPort(info); if(tempSerial.open(QIODevice::ReadWrite)) { ui->comboBox_serialSelect->addItem(tempSerial.portName()); tempSerial.close(); } } }
把查找的端口名放在一个列表里面。在软件中是放在测试专用的界面的串口选择下拉框中,如图:
-
找到端口以后,比如端口名为COM1,要设置端口属性,比如波特率,停止位,打开模式等等。
void Test::initSerials() // 初始化串口 { serial.setPortName(ui->comboBox_serialSelect->currentText()); // 设置串口名 serial.setBaudRate(ui->comboBox_baudRate->currentText().toInt()); // 设置波特率 serial.setStopBits(QSerialPort::OneStop); // 设置停止位 serial.setDataBits(QSerialPort::Data8); // 设置数据位 serial.setParity(QSerialPort::NoParity); // 设置校验位 serial.setFlowControl(QSerialPort::NoFlowControl); // 设置流控制 }
-
然后打开串口
serial.open(QIODevice::ReadWrite); // 以可读可写的方式打开串口
-
前面步骤做完后就可以实现和下位机实现通信。
-
发送数据,(用测试窗口发送)
void Test::on_pushButton_send_clicked() { serial.write(ui->plainTextEdit_singleSend->toPlainText().toLatin1()); }
-
接收数据,(用测试窗口接收,并且显示在调试窗口文本区)
void Test::readData() { if(!isMainWindowUse) // 判断是否是主窗口调用 { QByteArray buf; buf = serial.readAll(); if(!buf.isEmpty()) { ui->plainTextEdit_receiveDisplay->appendPlainText(buf); } buf.clear(); } }
演示:
-
-
下面是逻辑实现部分,给下位机依次发送什么样的数据。
// 单次测量 void Test::slot_singleTest() { if(isMainWindowUse && isSingletest) { QByteArray temp = firstData; vis1 = serial.readAll(); // 从串口读取数据放在vis1中 if(i % 3 == 0 && i != 0) { if(i == 3) vis2 = vis1; // 获得第一组测量数据的电桥状态 if(vis2 != vis1) // 获得每组第三次收到的数据与第一组的数据进行比较判断电桥是否平衡 { //emit testDone(R0, R01, R1, R2, Rx); i = 0; return; } } serial.write(temp); vis1.clear(); i++; } }