在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类。我们可以去
官网上下载。http://sourceforge.net/projects/qextserialport/files/,也可以直接去
下载到的文件为 qextserialport-1.2win-alpha.zip解压后如下图:
我们在windows下只需要使用其中的6个文件:
qextserialbase.cpp和qextserialbase.h,
qextserialport.cpp和qextserialport.h,
win_qextserialport.cpp和win_qextserialport.h
第一部分:
下面我们将讲述编程的详细过程,这里我们先给出完整的程序,然后到第二部分再进行逐句分析。
1.打开Qt Creator,新建Qt Gui Application,工程名随便你自己设置,也可以设置的和我的一样,其他使用默认选项。
(注意:建立的工程路径不能有中文。)
3.在工程中添加这6个文件。
新建工程然后在Qt Creator中左侧的文件列表上,鼠标右击工程文件夹,在弹出的菜单中选择Add Existing Files,添加刚才复制到工程的6个文件已存在的文件。如下图:
在serial2.h的相应位置添加头文件#include "win_qextserialport.h",添加对象声明Win_QextSerialPort *myCom;添加槽函数声明 void readMyCom()
点击文件serial2.ui,在窗口上加入一个Text Browser,用来显示信息
加入“打开串口”,“关闭串口”“传送数据”三个按钮,加入了一个行编辑框Line Edit。它们的命名如下:
“打开串口”按钮命名为:openMyComBtn
“关闭串口”按钮命名为:closeMyComBtn
“传送数据”按钮命名为:sendMsgBtn
要传送数据的行编辑框命名为:sendMsgLineEdit
界面如下图。
在serial2.cpp中添加构造函数
void serial2::on_openMyComBtn_clicked()
{
struct PortSettings myComSetting = {BAUD115200,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};
//定义一个结构体,用来存放串口各个参数
myCom = new Win_QextSerialPort("com4",myComSetting,QextSerialBase::EventDriven);
//定义串口对象,并传递参数,在构造函数里对其进行初始化
myCom ->open(QIODevice::ReadWrite);
//以可读写方式打开串口
connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作
ui->openMyComBtn->setEnabled(false); //打开串口后“打开串口”按钮不可用
ui->closeMyComBtn->setEnabled(true); //打开串口后“关闭串口”按钮可用
ui->sendMsgBtn->setEnabled(true); //打开串口后“发送数据”按钮可用
}
void serial2::on_closeMyComBtn_clicked()
{
myCom->close(); //关闭串口,该函数在win_qextserialport.cpp文件中定义
ui->openMyComBtn->setEnabled(true); //关闭串口后“打开串口”按钮可用
ui->closeMyComBtn->setEnabled(false); //关闭串口后“关闭串口”按钮不可用
ui->sendMsgBtn->setEnabled(false); //关闭串口后“发送数据”按钮不可用
}
void serial2::on_sendMsgBtn_clicked()
{
QString str = ui->sendMsgLineEdit->text().toLatin1();
QByteArray senddata;
StringToHex(str,senddata);
myCom->write(senddata);
//myCom->write(ui->sendMsgLineEdit->text().toLatin1());
//以十六进制码形式将行编辑框中的数据写入串口
}
void serial2::readMyCom() //读串口函数
{
QByteArray temp = myCom->readAll(); //读取串口缓冲区的所有数据给临时变量temp
QDataStream out(&temp,QIODevice::ReadWrite);
while(!out.atEnd())
{
qint8 outChar = 0;
out>>outChar; //每字节填充一次,直到结束
//十六进制的转换
QString str = QString("%1").arg(outChar & 0xFF,2,16,QLatin1Char('0'));
ui->textBrowser->insertPlainText(str.toUpper());//大写
ui->textBrowser->insertPlainText(" ");//每发送两个字符后添加一个空格
ui->textBrowser->moveCursor(QTextCursor::End);
}
}
然后要添加十六进制转换函数
char serial2::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);
else return ch-ch;//不在0-f范围内的会发送成0
}
void serial2::StringToHex(QString str, QByteArray & senddata) //字符串转换成16进制数据0-F
{
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);
}
运行显示如下图:
大家搭建不成功的可以给我发邮件[email protected],亲自帮你解决问题!