1. 程式人生 > >stm32CAN波特率計算小程式(QT原始碼)

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); } } } } }

所用到的計算公式該部落格,點選跳轉。
需要原始碼的,點選可下載。

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