最近用Qt5重写了以前用MFC做的串口通信程序,从中提取了基础的部分,
做了一个简单的程序完成了一些功能:
串口基本的收,发数据
串口是否可用判定,串口状态与按钮状态之间联系
串口发送:字符和16进制发送的选择,回车键也为发送
串口接收:16进制的接收,按1字节显示与按1个字显示选择
串口接收数据:txt的形式保存,清除接收数据
串口自动发送
我把这个简单的通信程序和一些用到的工具上传了,有需要的朋友可以去下载。
http://download.csdn.net/detail/lovebird_27/9227893
在这里,记录一些个人觉得重要的代码
新建一个Qt项目,基类选为QWidget,类名serial
在serial.h头文件中添加
#include
#include
private:
Ui::serial *ui;
QSerialPort *my_serialport;
QByteArray requestData;在serial.cpp中
串口的接收
my_serialport= new QSerialPort(); //定义1个串口类型
connect( my_serialport,SIGNAL(readyRead()),this,SLOT(updata()));
//一旦串口接收到数据,便会去执行updata()函数
void serial::updata()
{
requestData = my_serialport->readAll();
//读取数据 串口读取出来的数据类型 是QByteArray 不是QString
QString buf ;
·
·
buf = ShowHex(requestData); //显示为1个字节16进制
·
·
}
串口发送
if(ui->checkBox->checkState()) //判定是否选择16进制发送
{
my_serialport->write(QString2Hex(ui->sendlineEdit->text()));
//将文本编辑框editEdit的内容转化为16进制发送
//注意的是文本编辑框内容的类型是QString,串口的数据发送QByteArray
}
else
{
my_serialport->write(ui->sendlineEdit->text().toLatin1());
//将文本编辑框editEdit的内容以字符的形式发送
//QString向QByteArray转换,用.toLatin1(),有的版本是.toAsscii()
}
我把数据的转换是用在了datadeal.cpp中
向串口输入16进制,用下面两个函数就能实现
//将1-9 a-f字符转化为对应的整数
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);
}
//将字符型进制转化为16进制
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)
{
hstr=str[i].toLatin1(); //字符型
if(hstr == ' ')
{
i++;
continue;
}
i++;
if(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;
}
将串口接收的16进制数据显示出来
//将接收的一串QByteArray类型的16进制,转化为对应的字符串16进制
QString ShowHex(QByteArray str)
{
QDataStream out(&str,QIODevice::ReadWrite); //将str的数据 读到out里面去
QString buf;
while(!out.atEnd())
{
qint8 outChar = 0;
out >> outChar; //每次一个字节的填充到 outchar
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0')).toUpper() + QString(" "); //2 字符宽度
buf += str;
}
return buf;
}
将串口接收的16进制数据,每2个字节合并成1个字显示出来
QString Convert4Hex(QByteArray str)
{
QDataStream out(&str,QIODevice::ReadWrite); //将str的数据 读到out里面去
QString buf;
while(!out.atEnd())
{
qint16 outChar = 0;
out>>outChar; //每次一个字的填充到 outchar
QString str = QString("%1").arg(outChar&0xFFFF,4,16,QLatin1Char('0')).toUpper() + QString(" "); //4 字符宽度
buf += str;
}
return buf;
}
以上两种串口发送16进制,接收显示不同的处理,很类似。只是改变了QString.arg()的内容。QString.arg()函数用途很广,我前面的博文QString的使用中也提到了,希望大家做好对它的总结。
以上是我在Qt5中编写简单串口通信的核心部分,希望对大家有所帮助,如果需要看源代码的,我已上传,连接在文章开头处。