本文共 2944 字,大约阅读时间需要 9 分钟。
串口通信的应用十分广泛,所以在QT下编写一个串口通信程序就显得尤为重要。下面将一步一步叙述开发过程:
1.下载第三方QT串口类,免积分 2、首先来看一下串口通信几个关键文件: posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个Posix_QextSerialPort类; qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase类 ; 3、读取串口方式:Polling(查询方式)和EventDriven(事件驱动方式) 此两种方式在QextSerialBase类的一个枚举变量QueryMode中定义了。 事件驱动方式:使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,在事件驱动、的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。 查询方式:读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。需要建立定时器来读取串口的数据。 注意:在Windows下支持以上两种模式,而在Linux下只支持Polling模式。 4、总结一下: 我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。在Linux下是: qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h 在Linux下我们只能使用查询Polling方式。 5.工程命名为myCom,Base Class选择mainwindow。 然后将有关Linux下串口配置文件(cpp和h文件)添加到工程里面去:在minwindows.cpp添加
#include "mainwindow.h"#include "ui_mainwindow.h"#include "qextserialbase.h"#includeMainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ QTimer *readtimer = new QTimer(this); readtimer->start(100); ui->setupUi(this); struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500}; //定义一个结构体,用来存放串口各个参数 myCom = new Posix_QextSerialPort("/dev/ttyUSB0",myComSetting,QextSerialBase::Polling); myCom ->open(QIODevice::ReadWrite);//以可读写方式打开串口 myCom->setTimeout(100);//设置时间间隔 connect(readtimer,SIGNAL(timeout()),this,SLOT(readMyCom()));//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作 }MainWindow::~MainWindow(){ delete ui;}void MainWindow::readMyCom() //读串口函数{QByteArray temp = myCom->readAll();//读取串口缓冲区的所有数据给临时变量tempui->textBrowser->insertPlainText(temp);//将串口的数据显示在窗口的文本浏览器中}static char ConvertHexChar(char ch){ if((ch >= '0') && (ch <= '9')) return ch-0x30; else if((ch >= 'A') && (ch <= 'F')) return ch-'A'+10; else if((ch >= 'a') && (ch <= 'f')) return ch-'a'+10; else return (-1);}static QByteArray QString2Hex(QString str) { QByteArray senddata; int hexdata,lowhexdata; int hexdatalen = 0; int len = str.length(); senddata.resize(len/2); char lstr,hstr; for(int i=0; i = len) break; lstr = str[i].toLatin1(); hexdata = ConvertHexChar(hstr); lowhexdata = ConvertHexChar(lstr); if((hexdata == 16) || (lowhexdata == 16)) break; else hexdata = hexdata*16+lowhexdata; i++; senddata[hexdatalen] = (char)hexdata; hexdatalen++; } senddata.resize(hexdatalen); return senddata; }void MainWindow::on_pushButton_clicked(){ //myCom->write(ui->lineEdit->text().toLatin1().data()); //以ASCII码形式将数据写入串口 QByteArray senddata = QString2Hex(ui->lineEdit->text()); //转换为16进制 myCom->write(senddata);}