stm32CAN波特率計算小程序(QT源碼)

  • 軟件:Qt Creator
  • 開發環境:Window7

用qt做得一個計算波特率的小程序,在實際的應用中我們設置波特率的時候是通過以下參數來定的:

CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_6tq;
CAN_InitStructure.CAN_Prescaler=5;

波特率計算小程序的截圖:
這裏寫圖片描述
根據所需的的採樣點、波特率以及錯誤率得到以上外設初始化所需的參數。

據網上資料,採樣點的設置有以下規律:

75%     when 波特率 > 800K
80%     when 波特率 > 500K
87.5%   when 波特率 <= 500K

下面附上部分qt的源代碼:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStandardItemModel>
#include <qDebug>

MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{
    ui->setupUi(this);

       m_model=new QStandardItemModel;

       m_model->setColumnCount(6);
       /*設置表頭信息*/
       m_model->setHeaderData(0,Qt::Horizontal,QString::fromUtf8("BS1"));
       m_model->setHeaderData(1,Qt::Horizontal,QString::fromUtf8("BS2"));
       m_model->setHeaderData(2,Qt::Horizontal,QString::fromUtf8("BRP"));
       m_model->setHeaderData(3,Qt::Horizontal,QString::fromUtf8("Sample Point"));
       m_model->setHeaderData(4,Qt::Horizontal,QString::fromUtf8("Baud Rate"));
       m_model->setHeaderData(5,Qt::Horizontal,QString::fromUtf8("Error"));

       ui->tableView->setModel(m_model);//將這個model套用到tableview上
       ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);//鼠標點擊就會選中整行
       ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);//列表內容不可編輯


}


MainWindow::~MainWindow()
{
    delete ui,m_model;
}

int MainWindow::getUsrValue(QString str)//提取控件當前text字符串中的數字
{
    QString tmp;
    for(int j = 0; j < str.length(); j++)
    {
    if(str[j] >= '0' && str[j] <= '9')
    tmp.append(str[j]);
    }
    return tmp.toInt();
}
float MainWindow::getAbsolutevalue(float num1,float num2)//求絕對值
{
    return (num1>num2)?(num1-num2):(num2-num1);
}
void  MainWindow::putResult_Row(int i,int j,int tempBrp,float SamplePoint,float BaudRate,float Error)//輸出打印一行的結果
{
    m_model->setItem(row,0,new QStandardItem(QString("CAN_BS1_%1tq").arg(i)));
    m_model->setItem(row,1,new QStandardItem(QString("CAN_BS2_%1tq").arg(j)));
    m_model->setItem(row,2,new QStandardItem(QString::number(tempBrp)));
    m_model->setItem(row,3,new QStandardItem(QString::number(SamplePoint*100,'f',1)+"%"));
    m_model->setItem(row,4,new QStandardItem(QString::number(BaudRate,'f',1)));
    m_model->setItem(row,5,new QStandardItem(QString::number(Error,'f',1)+"%"));
    row++;
}
void MainWindow::on_pushButton_clicked() //當按鈕按下時執行的函數
{
    int i,j,tempBrp,tempBrp1,tempBrp2;
    float SamplePoint,BaudRate,Error;
    row=0;

    m_model->removeRows(0,m_model->rowCount());
    UsrSP_value=this->getUsrValue(ui->comboBox->currentText());
    UsrER_value=this->getUsrValue(ui->comboBox_2->currentText());
    UsrAPB_value=ui->lineEdit->text().toFloat();
    UsrBR_value=ui->lineEdit_2->text().toFloat();
    for(i=1;i<17;i++) //BS1的範圍 1-16
    {
         for(j=1;j<9;j++) //BS2的範圍 1-8
         {
           SamplePoint=(1+i*1.0)/(1+i*1.0+j*1.0); //求出採樣點
           if((SamplePoint*100)>=(float)UsrSP_value) //滿足採樣點所設要求則進入下一步篩選
           {
            tempBrp=UsrAPB_value*1000/((1+i+j)*UsrBR_value); //求出分頻

            if(tempBrp>1)
            {
                //qDebug() <<tempBrp <<i <<j;
                BaudRate=(UsrAPB_value*1000)/(tempBrp*(1+i+j)*1.0); //求出實際波特率
                //qDebug() <<BaudRate;
                Error=(this->getAbsolutevalue(BaudRate,UsrBR_value)/UsrBR_value)*100;//求出錯誤率
                //qDebug() <<Error <<"%" <<endl;
                if(Error>UsrER_value) continue; //如果錯誤率大於要求的 則放棄這一次循環輸出 直接跳到下一次循環
                this->putResult_Row(i,j,tempBrp,SamplePoint,BaudRate,Error);
            }
            tempBrp1=tempBrp;
            tempBrp2=tempBrp;
            /*分別向tempBrp正反方向拓展 尋找更多合適的tempBrp*/
            while(tempBrp1--)
            {
                if(tempBrp1<2) break;
                //qDebug() <<tempBrp <<i <<j;
                BaudRate=(UsrAPB_value*1000)/(tempBrp1*(1+i+j)*1.0); //求出實際波特率
                //qDebug() <<BaudRate;
                Error=(this->getAbsolutevalue(BaudRate,UsrBR_value)/UsrBR_value)*100;//求出錯誤率
                //qDebug() <<Error <<"%" <<endl;
                if(Error>UsrER_value) break; //如果錯誤率大於要求的 則跳出while循環
                 this->putResult_Row(i,j,tempBrp1,SamplePoint,BaudRate,Error);
            }
            while(tempBrp2++)
            {
                //qDebug() <<tempBrp <<i <<j;
                BaudRate=(UsrAPB_value*1000)/(tempBrp2*(1+i+j)*1.0); //求出實際波特率
                //qDebug() <<BaudRate;
                Error=(this->getAbsolutevalue(BaudRate,UsrBR_value)/UsrBR_value)*100;//求出錯誤率
                //qDebug() <<Error <<"%" <<endl;
                if(Error>UsrER_value) break; //如果錯誤率大於要求的 則跳出循環
                this->putResult_Row(i,j,tempBrp2,SamplePoint,BaudRate,Error);
            }
           }
         }
    }
}

所用到的計算公式該博客,點擊跳轉。
需要源代碼的,點擊可下載。

僅供參考,錯誤之處以及不足之處還望多多指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章