1.Qt串口類的選擇
最近在做一個小專案,需要用到Qt做上位機軟體,本人也是邊學邊做,買了本《QtCreator快速入門》看了看就動手了,由于初學不是很了解Qt5的官方資源,一開始串口開發使用的是第三方串口類QExtSerialPort,但是后來發現這個第三方串口類似乎不提供串口資訊的查詢,就果斷放棄了,
同時也發現Qt5本身是提供串口類的,所以就用了官方資源,官方的串口類是提供串口資訊查詢,也就可以實作上位機軟體的的串口號查找功能了,人性化很多,
2.如何實作Qt上位機軟體串口的按位元組資料處理?
這部分我在網上找了許多資料都不太管用,一些常見的學習資料,基本上都是說,在槽函式里使用QByteArray型別變數直接讀出串口物件的全部資料,資料范例如下:
void Widget::readMyCom() //讀取串口資料并顯示出來
{
QByteArray temp = myCom->readAll();
//讀取串口緩沖區的所有資料給臨時變數 temp
ui->textBrowser->insertPlainText(temp);
//將串口的資料顯示在視窗的文本瀏覽器中
}
在我這個專案里,需要從STM32(下位機)的串口接收6位元組長度的資料,然后上位機軟體接收資料,再做進一步處理作業, 顯然上面的方法不適合,因為以上讀出來的資料是一個流式文本,時長時短,不好控制長度,經過我仔細地檢索資訊,功夫不負有心人,終于找到了解決辦法,大家可以參考這個知乎問答:
https://www.zhihu.com/question/46717728?sort=created
3.我的例子
首先是下位機部分,我這里測驗時是在定時器更新中斷中完成串口發送的,代碼如下:
char num = 0;
int SHU = 0;
char DataBuff[6]={0x00};
float i = 0.0;
void TIM2_IRQHandler( void )
{
if( TIM_GetITStatus( TIM2,TIM_IT_Update )!= RESET )
{
TIM_ClearITPendingBit( TIM2,TIM_IT_Update );
SHU = i*100;//取四個整數和兩個小數,i放大100倍,方便取小數
//注意取出來的數必須加0x30
//要以字符的形式發送才行,上位機軟體才可以用qDebug()列印出來
DataBuff[0] = SHU/100000+0x30;
DataBuff[1] = ( SHU%100000)/10000+0x30;
DataBuff[2] = (( SHU%100000)%10000)/1000+0x30;
DataBuff[3] = ((( SHU%100000)%10000)%1000)/100+0x30;
DataBuff[4] = ((((SHU%100000)%10000)%1000)%100)/10+0x30;
DataBuff[5] = ((((SHU%100000)%10000)%1000)%100)%10+0x30;
USART1->SR;//空讀SR,避免硬體上電后,首位元組發送丟失
for( num=0;num<6;num++ )
{
USART_SendData( USART1,DataBuff[num]);
while( USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET );
USART_ClearFlag( USART1,USART_FLAG_TC );
}
if(i==1500) i=0;
else i++;
}
}
再是Qt上位機軟體的信號和槽函式連接:
//連接信號至槽函式:串口有資料就讀串口
connect(mycom,SIGNAL(readyRead()),this,SLOT(MyReadData()));
最后是槽函式和列印資訊:
char DataBuff[6] = {0x00};//在類中定義
unsigned char cnt = 0; //在類中定義
float distance = 0.0; //在類中定義
void MainWindow::MyReadData( void )
{
char ch = 0;
while( mycom->read(&ch,1) )
{
DataBuff[cnt] = ch;
cnt++;
if( cnt == 6 )
{
cnt = 0;
distance = (DataBuff[0]-0x30)*1000+(DataBuff[1]-0x30)*100+(DataBuff[2]-0x30)*10+
(DataBuff[3]-0x30)+ (DataBuff[4]-0x30)*0.1+(DataBuff[5]-0x30)*0.01;
qDebug("%4.2f",distance);
qDebug()<<DataBuff;
}
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/248157.html
標籤:其他
