关于Qt5 QtSerialPort串口通信

最近用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中编写简单串口通信的核心部分,希望对大家有所帮助,如果需要看源代码的,我已上传,连接在文章开头处。
 
  
 
  
 
  
 
  
 
  
 
  

你可能感兴趣的:(Qt)