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
#include 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() <BaudRate=(UsrAPB_value*1000)/(tempBrp*(1+i+j)*1.0); //求出实际波特率//qDebug() <Error=(this->getAbsolutevalue(BaudRate,UsrBR_value)/UsrBR_value)*100;//求出错误率//qDebug() <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() <BaudRate=(UsrAPB_value*1000)/(tempBrp1*(1+i+j)*1.0); //求出实际波特率//qDebug() <Error=(this->getAbsolutevalue(BaudRate,UsrBR_value)/UsrBR_value)*100;//求出错误率//qDebug() <if(Error>UsrER_value) break; //如果错误率大于要求的 则跳出while循环this->putResult_Row(i,j,tempBrp1,SamplePoint,BaudRate,Error);}while(tempBrp2++){//qDebug() <BaudRate=(UsrAPB_value*1000)/(tempBrp2*(1+i+j)*1.0); //求出实际波特率//qDebug() <Error=(this->getAbsolutevalue(BaudRate,UsrBR_value)/UsrBR_value)*100;//求出错误率//qDebug() <if(Error>UsrER_value) break; //如果错误率大于要求的 则跳出循环this->putResult_Row(i,j,tempBrp2,SamplePoint,BaudRate,Error);}}}}
}
所用到的计算公式该博客,点击跳转。
需要源代码的,点击可下载。
仅供参考,错误之处以及不足之处还望多多指教。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
