这里介绍一下,用QT5实现串口通信的应用程序。
新建工程,选QWidget为基类,如下图所示。
在.pro文件,中添加QT+=serialport
编辑界面文件,如下图所示。(所有控件名都要重新设置)
右击你的控件,如:按键,再点转到槽,就可以跳到该按键的槽函数。
在widget.h中添加头文件,以及槽函数和私有的串口类的声明
#include <QtSerialPort/QSerialPort>
private slots:void on_openPortBtn_clicked(); //利用“转到槽”添加的槽函数声明void read_Com(); //手动添加的槽函数声明,用于读出串口缓冲区的内容void on_SendBtn_clicked(); //利用“转到槽”添加的槽函数声明private:Ui::Widget *ui;QSerialPort serial; //声明串口类
main.cpp可以不改,然后,在widget.cpp中添加槽函数的定义
void Widget::on_openPortBtn_clicked()
{
if(ui->portNameComboBox->isEnabled())
{
ui->openPortBtn->setText("ClosePort"); //按下“OpenPort”后,按键显示为“ClosePort”
ui->portNameComboBox->setDisabled(true); //按下“OpenPort”后,禁止再修改COM口
serial.setPortName(ui->portNameComboBox->currentText()); //设置COM口
serial.setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
serial.setDataBits(QSerialPort::Data8); //数据位为8位
serial.setFlowControl(QSerialPort::NoFlowControl);//无流控制
serial.setParity(QSerialPort::NoParity); //无校验位
serial.setStopBits(QSerialPort::OneStop); //一位停止位
serial.close(); //先关串口,再打开,可以保证串口不被其它函数占用。
if(serial.open(QIODevice::ReadWrite)) //以可读写的方式打开串口
{
connect(&serial,SIGNAL(readyRead()),this,SLOT(read_Com())); //把串口的readyRead()信号绑定到read_Com()这个槽函数上
}
} else {
ui->openPortBtn->setText("OpenPort"); //按下“ClosePort”后,按键显示为“OpenPort”
ui->portNameComboBox->setEnabled(true); //按下“ClosePort”后,COM口可被修改
serial.close(); //关串口
}
}
void Widget::read_Com()
{
QByteArray temp=serial.read(1);//在缓冲区中读一个byte
if(!temp.isEmpty())//如果读到的数据不为空
{
ui->recvTextBrowser->insertPlainText("0x");
ui->recvTextBrowser->insertPlainText(temp.toHex());//显示接收到的数据的十六进制
ui->recvTextBrowser->insertPlainText(" ");
}
}
void Widget::on_SendBtn_clicked()
{
serial.write(ui->sendTextEdit->toPlainText().toLatin1());//以ASCII码的形式通过串口发送出去。
}
最终效果如下图所示:
因为QT5没有QString转十六进制的函数,要自己写,所以上图中,PC机发送5,而FPGA显示为35(即ASCII码5的十六进制数),而接收过来的数据是QByteArray,这个可以直接转成十六进制,所以上图中,FPGA发送8,PC机接收到0x08。
BTW:该程序只用一个线程,也就是说,你让它一边接收数据,一边画出拆线图,是不行的。要实现这种功能,要用到多线程的QThread类。
该程序只是演示最简单的串口发收功能,还远远达不到工业级的要求。
工业级的要求是:收发双方都要加上CRC检验、重传机制、出错/异常处理、甚至是总线仲裁,才能构成一套完备的通信程序。当然,界面也不能做得太难看,不然客户每次用的时候,都觉得恶心。