1. 程式人生 > >關於Qt5 QtSerialPort串列埠通訊----帶工程原始碼下載

關於Qt5 QtSerialPort串列埠通訊----帶工程原始碼下載

相關文章

最近用Qt5重寫了以前用MFC做的串列埠通訊程式,從中提取了基礎的部分,

做了一個簡單的程式完成了一些功能:

串列埠基本的收,發資料
串列埠是否可用判定,串列埠狀態與按鈕狀態之間聯絡
串列埠傳送:字元和16進位制傳送的選擇,回車鍵也為傳送
串列埠接收:16進位制的接收,按1位元組顯示與按1個字顯示選擇
串列埠接收資料:txt的形式儲存,清除接收資料
串列埠自動傳送

我把這個簡單的通訊程式和一些用到的工具上傳了,有需要的朋友可以去下載。

在這裡,記錄一些個人覺得重要的程式碼

新建一個Qt專案,基類選為QWidget,類名serial

在serial.h標頭檔案中新增

#include<QtSerialPort/QSerialPort>
#include<QtSerialPort/QSerialPortInfo>

private:
Ui::serial*ui;
QSerialPort*my_serialport;
QByteArrayrequestData;
在serial.cpp中

串列埠的接收

my_serialport=newQSerialPort();     //定義1個串列埠型別
connect(my_serialport,SIGNAL(readyRead()),this,SLOT(updata()));
//一旦串列埠接收到資料,便會去執行updata()函式
voidserial::updata()
{
requestData=my_serialport->readAll();
//讀取資料  串列埠讀取出來的資料型別 是QByteArray 不是QString
QStringbuf;
·
·
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-9a-f字元轉化為對應的整數
charConvertHexChar(charch)
{
if((ch>='0')&&(ch<='9'))
returnch-0x30;
elseif((ch>='A')&&(ch<='F'))
returnch-'A'+10;
elseif((ch>='a')&&(ch<='f'))
returnch-'a'+10;
elsereturn(-1);
}
//將字元型進位制轉化為16進位制
QByteArrayQString2Hex(QStringstr)
{
QByteArraysenddata;
inthexdata,lowhexdata;
inthexdatalen=0;
intlen=str.length();
senddata.resize(len/2);
charlstr,hstr;
for(inti=0;i<len;)
{
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);
returnsenddata;
}
將串列埠接收的16進位制資料顯示出來
//將接收的一串QByteArray型別的16進位制,轉化為對應的字串16進位制
QStringShowHex(QByteArraystr)
{
QDataStreamout(&str,QIODevice::ReadWrite);//將str的資料讀到out裡面去
QStringbuf;
while(!out.atEnd())
{
qint8outChar=0;
out>>outChar;//每次一個位元組的填充到outchar
QStringstr=QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0')).toUpper()+QString("");//2字元寬度
buf+=str;
}
returnbuf;
}
將串列埠接收的16進位制資料,每2個位元組合併成1個字顯示出來
QStringConvert4Hex(QByteArraystr)
{
QDataStreamout(&str,QIODevice::ReadWrite);//將str的資料讀到out裡面去
QStringbuf;
while(!out.atEnd())
{
qint16outChar=0;
out>>outChar;//每次一個字的填充到outchar
QStringstr=QString("%1").arg(outChar&0xFFFF,4,16,QLatin1Char('0')).toUpper()+QString("");//4字元寬度
buf+=str;
}
returnbuf;
}
以上兩種串列埠傳送16進位制,接收顯示不同的處理,很類似。只是改變了QString.arg()的內容。QString.arg()函式用途很廣,我前面的博文QString的使用中也提到了,希望大家做好對它的總結。
以上是我在Qt5中編寫簡單串列埠通訊的核心部分,希望對大家有所幫助,如果需要看原始碼的,我已上傳,連線在文章開頭處。