欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
CAN Bootloader協議介紹與C++源碼
[打印本頁]
作者:
xiancai2
時間:
2018-10-21 20:53
標題:
CAN Bootloader協議介紹與C++源碼
CAN Bootloader命令列表
命令名稱 命令值(Hex) 說明
GET_ADDR(1) 000 向主機請求本機地址
ERASE(2) XX1 擦除應用程序
WRITE(3) XX2 將程序寫入Flash
READ(4) XX3 將程序從Flash中讀出
GO(5) XX4 執行應用程序
SET_WRITE_ADDR XX5 設置寫數據起始地址
WRITE_CONTINUOUS XX6 連續寫數據,寫數據地址自動遞增
SET_READ_ADDR XX7 設置讀數據起始地址
READ_CONTINUOUS XX8 連續讀數據,讀數據起始地址遞增
GET_VERSION XX9 獲取Bootloader固件版本
ADDR_OK XXC 請求地址可用
ADDR_ERROR XXD 請求地址不可用
CMD_OK XXE 命令執行成功
CMD_ERROR XXF 命令執行失敗
1、本機地址為7bit,所以在CAN總線上最多只能連接128個節點,本命令由從機發出,主機會給從機分配一個臨時地址并回復CMD_OK,如果主機地址使用完畢則回復CMD_ERROR,從機可以根據接收到的主機反饋判斷本機地址設置是否成功;
2、擦除應用程序命令會帶擦除起始地址和擦除結束地址;
3、寫數據命令帶4字節寫數據地址參數和4字節的數據;
4、讀數據命令會攜帶4字節地址,從機返回4字節數據;
5、執行應用程序;
命令詳解
GET_ADDR:
該命令由從機發送給主機,主機接收到該命令后會分配一個地址給從機,如果主機無法分配地址則發送ADDR_ERROR回復從機,此時從機應進入無法獲取地址的錯誤處理程序中。主機和從機在發送命令的時候必須攜帶8字節物理地址,也就是說DLC為8。從機如果正確獲取到地址后可以設置過濾器為只接收和自己地址匹配的數據,這樣可以減少CPU的負擔。
ERASE:
擦除應用程序儲存地址區域的數據,該命令由主機發送給從機,命令攜帶8字節數據,前4字節數據為擦出起始地址,后4字節為擦出結束地址,從機接收到該命令后可回復CMD_OK或CMD_ERROR給主機。
WRITE:
將一個字(4Byte)的數據寫入指定的Flash地址,該命令由主機發送給從機,命令攜帶8字節數據,前4字節為數據寫入地址,后4字節為準備寫入的數據。
READ:
從指定的Flash地址讀取4字節的數據,該命令由主機發送給從機或者從機發送給主機,主機發送給從機的時候攜帶4字節地址參數,從機發送給主機的時候攜帶4字節的數據。
GO:
執行應用程序,該命令由主機發送給從機,命令攜帶4字節的地址參數,從機接收到該命令后從指定的地址開始執行程序。
SET_WRITE_ADDR:
設置連續寫數據的起始地址,該命令由主機發送給從機,命令攜帶4字節的地址參數。
WRITE_CONTINUOUS:
連續寫數據到Flash中,該命令由主機發送給從機,從機根據SET_WRITE_ADDR命令設置的起始地址將程序數據寫入Flash中,該命令攜帶最多8字節的程序數據。
SET_READ_ADDR:
設置連續讀數據起始地址,該命令由主機發送給從機,命令攜帶4字節的地址參數。
READ_CONTINUOUS:
連續讀數據,該命令由主機發送給從機或者由從機發送給主機,由主機發送給從機時DLC為0,從機接收到這個命令后將該命令攜帶最多8字節數據返回給主機。
GET_VERSION:
獲取Bootloader固件版本號,版本號由兩字節組成,第一字節為主版本號,第二字節為從版本號。
ADDR_OK:
返回合法的從機地址。
ADDR_ERROR:
不能正常分配從機地址。
CMD_OK:
命令支持成功。
CMD_ERROR:
命令執行失敗。
單片機源程序如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
typedef struct {
unsigned char SJW;
unsigned char BS1;
unsigned char BS2;
unsigned short PreScale;
} tCAN_BaudRate;
#define GET_ADDR 0x0 //向主機請求本機地址,XX為本機地址,一共7bit
#define ERASE 0x1 //擦除應用程序
#define WRITE 0x2 //將程序寫入Flash
#define READ 0x3 //將程序從Flash中讀出
#define GO 0x4 //執行應用程序
#define SET_WRITE_ADDR 0x5 //設置寫數據起始地址
#define WRITE_CONTINUOUS 0x6 //連續寫數據,寫數據地址自動遞增
#define SET_READ_ADDR 0x7 //設置讀數據起始地址
#define READ_CONTINUOUS 0x8 //連續讀數據,讀數據起始地址遞增
#define GET_VERSION 0x9 //獲取Bootloader固件版本
#define ONLINE_CHECK 0xA //檢測CAN節點是否在線
#define ADDR_OK 0xC //請求地址可用
#define ADDR_ERROR 0xD //請求地址不可用
#define CMD_OK 0xE //命令執行成功
#define CMD_ERROR 0xF //命令執行失敗
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
int ret;
ui->setupUi(this);
for(int i=0;i<128;i++){
can_addr.local_addr[i]=0;
}
nodeTableInit();
ret = VCI_ScanDevice(1);
if(ret<=0){
QMessageBox::warning(this,"Warning","No device Connected!");
return;
}
ret = VCI_OpenDevice(VCI_USBCAN2,ui->deviceIndexComboBox->currentIndex(),0);
if(ret!=STATUS_OK){
QMessageBox::warning(this,"Warning","Open device Error!");
return;
}
if(canInit()){
ret = VCI_StartCAN(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex());
if(ret!=STATUS_OK){
QMessageBox::warning(this,"Warning","Start CAN Error!");
return;
}
}
scanNodeTimerID = startTimer(100);
}
MainWindow::~MainWindow()
{
VCI_ResetCAN(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex());
VCI_CloseDevice(VCI_USBCAN2,ui->deviceIndexComboBox->currentIndex());
delete ui;
}
void MainWindow::nodeTableInit(void)
{
QStringList strList;
strList << "Addr" << "MAC(Hex)" << "Version";
model = new QStandardItemModel;
model->setColumnCount(strList.count());
model->setRowCount(127);
model->setHorizontalHeaderLabels(strList);
ui->nodeListTableView->setModel(model);
ui->nodeListTableView->setColumnWidth(0, 50);
ui->nodeListTableView->setColumnWidth(1, 160);
ui->nodeListTableView->setColumnWidth(2, 60);
ui->nodeListTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
ui->nodeListTableView->setSelectionBehavior(QAbstractItemView::SelectRows); //整行選中的方式
ui->nodeListTableView->verticalHeader()->setDefaultSectionSize(20);
ui->nodeListTableView->verticalHeader()->hide();
for(int r=0;r<model->rowCount();r++){
for(int c = 0; c < model->columnCount(); c++)
{
QStandardItem *item = new QStandardItem("");
model->setItem(r,c,item);
}
}
}
int MainWindow::CAN_GetBaudRateNum(unsigned int BaudRate)
{
switch(BaudRate){
case 1000000 :return 0;
case 900000 :return 1;
case 800000 :return 2;
case 666000 :return 3;
case 600000 :return 4;
case 500000 :return 5;
case 400000 :return 6;
case 300000 :return 7;
case 250000 :return 8;
case 225000:return 9;
case 200000 :return 10;
case 160000:return 11;
case 150000 :return 12;
case 144000:return 13;
case 125000 :return 14;
case 120000:return 15;
case 100000 :return 16;
case 90000 :return 17;
case 80000 :return 18;
case 75000:return 19;
case 60000 :return 20;
case 50000 :return 21;
case 40000 :return 22;
case 30000 :return 23;
case 20000 :return 24;
default:return 0;
}
}
bool MainWindow::canInit(void)
{
int ret;
tCAN_BaudRate CAN_BaudRateInitTab[]= { // CLK=36MHz
1,5,3,4, // 1M
1,4,3,5, // 900K
1,5,3,5, // 800K
1,5,3,6, // 666K
1,6,3,6, // 600K
1,5,2,9, // 500K
1,7,2,9, // 400K
1,16,3,6, // 300K
1,4,3,18, // 250K
1,6,3,16, // 225K
1,8,3,15, // 200K
1,4,4,25, // 160K
1,5,4,24, // 150K
1,5,4,25, // 144K
1,13,4,16, // 125K
1,10,4,20, // 120K
1,9,5,24, // 100K
1,10,5,25, // 90K
1,12,5,25, // 80K
1,9,6,30, // 75K
1,7,7,40, // 60K
1,8,7,45, // 50K
1,9,8,50, // 40K
1,6,3,120, // 30K
1,3,2,300, // 20K
};
VCI_INIT_CONFIG_EX CAN_InitConfig;
QString str = ui->baudRateComboBox->currentText();
str.resize(str.length()-4);
int baud = str.toInt(NULL,10)*1000;
CAN_InitConfig.CAN_BRP = CAN_BaudRateInitTab[CAN_GetBaudRateNum(baud)].PreScale;
CAN_InitConfig.CAN_SJW = CAN_BaudRateInitTab[CAN_GetBaudRateNum(baud)].SJW;
CAN_InitConfig.CAN_BS1 = CAN_BaudRateInitTab[CAN_GetBaudRateNum(baud)].BS1;
CAN_InitConfig.CAN_BS2 = CAN_BaudRateInitTab[CAN_GetBaudRateNum(baud)].BS2;
CAN_InitConfig.CAN_ABOM = 1;
CAN_InitConfig.CAN_Mode = 0;
CAN_InitConfig.CAN_NART = 0;
CAN_InitConfig.CAN_RELAY = 0;
CAN_InitConfig.CAN_RFLM = 0;
CAN_InitConfig.CAN_TXFP = 1;
ret = VCI_InitCANEx(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_InitConfig);
if(ret!=STATUS_OK){
QMessageBox::warning(this,"Warning","Initialize device Error!");
return false;
}
VCI_FILTER_CONFIG CAN_Filter;
CAN_Filter.Enable = 1;
CAN_Filter.ExtFrame = 0;
CAN_Filter.FilterIndex = 0;
CAN_Filter.FilterMode = 0;
CAN_Filter.ID_IDE = 0;
CAN_Filter.ID_RTR = 0;
CAN_Filter.ID_Std_Ext = 0;
CAN_Filter.MASK_IDE = 0;
CAN_Filter.MASK_RTR = 0;
CAN_Filter.MASK_Std_Ext = 0;
ret = VCI_SetFilter(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_Filter);
if(ret!=STATUS_OK){
QMessageBox::warning(this,"Warning","Set filter Error!");
return false;
}
return true;
}
void MainWindow::logMessage(QString str)
{
ui->logTextEdit->moveCursor(QTextCursor::End);
ui->logTextEdit->append(str);
}
bool MainWindow::setStartAddr(unsigned char can_node_addr,unsigned int startAddr)
{
VCI_CAN_OBJ CAN_SendData;
VCI_CAN_OBJ CAN_ReadData;
int ret,retry;
CAN_SendData.Data[0] = startAddr>>24;
CAN_SendData.Data[1] = startAddr>>16;
CAN_SendData.Data[2] = startAddr>>8;
CAN_SendData.Data[3] = startAddr>>0;
CAN_SendData.DataLen = 4;
CAN_SendData.ID = (can_node_addr<<4)|SET_WRITE_ADDR;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
ret = VCI_Transmit(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_SendData,
1);
if(ret!=1){
logMessage("Set start address error!");
QMessageBox::warning(this,"Warning","Set start address error!");
return false;
}
retry = 0;
while(1){
Sleep(10);
ret = VCI_Receive(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_ReadData,
1);
if((ret==1)&&(can_node_addr==(CAN_ReadData.ID>>4))&&((CAN_ReadData.ID&0xF)==CMD_OK)){
break;
}else{
Sleep(10);
retry++;
if(retry>5){
logMessage("Set start address error!");
QMessageBox::warning(this,"Warning","Set start address error!");
return false;
}
QCoreApplication::processEvents(QEventLoop::AllEvents);
}
}
logMessage("Set start success!");
return true;
}
bool MainWindow::eraseSectors(unsigned char can_node_addr,unsigned int startAddr,unsigned int EndAddr)
{
VCI_CAN_OBJ CAN_SendData;
VCI_CAN_OBJ CAN_ReadData;
int ret,retry;
if(startAddr>EndAddr){
QMessageBox::warning(this,"Warning","Address error!");
return false;
}else{
CAN_SendData.Data[0] = startAddr>>24;
CAN_SendData.Data[1] = startAddr>>16;
CAN_SendData.Data[2] = startAddr>>8;
CAN_SendData.Data[3] = startAddr>>0;
CAN_SendData.Data[4] = EndAddr>>24;
CAN_SendData.Data[5] = EndAddr>>16;
CAN_SendData.Data[6] = EndAddr>>8;
CAN_SendData.Data[7] = EndAddr>>0;
CAN_SendData.DataLen = 8;
CAN_SendData.ID = (can_node_addr<<4)|ERASE;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
ret = VCI_Transmit(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_SendData,
1);
if(ret!=1){
logMessage("Erase sectors error!");
QMessageBox::warning(this,"Warning","Send Data Error!");
return false;
}
logMessage("Start erase sectors,please wait...");
retry = 0;
while(1){
Sleep(10);
ret = VCI_Receive(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_ReadData,
1);
if((ret==1)&&(can_node_addr==(CAN_ReadData.ID>>4))&&((CAN_ReadData.ID&0xF)==CMD_OK)){
break;
}else{
Sleep(10);
retry++;
if(retry>200){
logMessage("Erase sectors error!");
QMessageBox::warning(this,"Warning","Erase sector error!");
return false;
}
QCoreApplication::processEvents(QEventLoop::AllEvents);
}
}
logMessage("Erase sector success!");
return true;
}
}
void MainWindow::on_updatePushButton_clicked()
{
int ret,retry;
QString str;
uint32_t startAddr = ui->startAddrLineEdit->text().toInt(NULL,16);
VCI_CAN_OBJ CAN_SendData;
VCI_CAN_OBJ CAN_ReadData;
QFile firmwareFile(ui->fileLineEdit->text());
if(model->item(ui->nodeListTableView->currentIndex().row(),0)->text().isEmpty()){
QMessageBox::warning(this,"Warning","Please select online can node!");
return;
}
uint8_t can_node_addr = ui->nodeListTableView->currentIndex().row()+1;
if (firmwareFile.open(QFile::ReadOnly)){
killTimer(scanNodeTimerID);
//擦出程序扇區
if(!eraseSectors(can_node_addr,startAddr,startAddr+firmwareFile.size())){
scanNodeTimerID = startTimer(100);
return;
}
//設置程序起始地址
if(!setStartAddr(can_node_addr,startAddr)){
scanNodeTimerID = startTimer(50);
return;
}
logMessage("Start write firmware data...");
str.sprintf("CAN node address:%d",can_node_addr);
logMessage(str);
str.sprintf("Firmware start address(Hex):%08X",startAddr);
logMessage(str);
str.sprintf("Firmware size:%d Byte",firmwareFile.size());
logMessage(str);
str.sprintf("Current Progress:%3d%%",0);
logMessage(str);
for(int i=0;i<firmwareFile.size();i+=8){
firmwareFile.read((char*)(&CAN_SendData.Data[0]),8);
CAN_SendData.DataLen = 8;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
CAN_SendData.ID = (can_node_addr<<4)|WRITE_CONTINUOUS;
ret = VCI_Transmit(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_SendData,
1);
if(ret!=1){
logMessage("Write firmware data error!");
QMessageBox::warning(this,"Warning","Send Data Error!");
scanNodeTimerID = startTimer(100);
return;
}
//設置更新進度
QTextCursor cursor = ui->logTextEdit->textCursor();
cursor.deletePreviousChar();
cursor.deletePreviousChar();
cursor.deletePreviousChar();
cursor.deletePreviousChar();
str.sprintf("%3d%%",i*100/firmwareFile.size());
ui->logTextEdit->insertPlainText(str);
retry = 0;
while(1){
ret = VCI_Receive(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_ReadData,
1);
if((ret==1)&&(can_node_addr==(CAN_ReadData.ID>>4))&&((CAN_ReadData.ID&0xF)==CMD_OK)){
break;
}else{
Sleep(10);
retry++;
if(retry>10){
logMessage("Write firmware data error!");
QMessageBox::warning(this,"Warning","Get ACK error!");
scanNodeTimerID = startTimer(100);
return;
}
}
}
QCoreApplication::processEvents(QEventLoop::AllEvents);
}
//設置更新進度
QTextCursor cursor = ui->logTextEdit->textCursor();
cursor.deletePreviousChar();
cursor.deletePreviousChar();
cursor.deletePreviousChar();
cursor.deletePreviousChar();
str.sprintf("%3d%%",100);
ui->logTextEdit->insertPlainText(str);
logMessage("Write firmware data success!");
QMessageBox::information(this,"Information","Update firmware success!");
scanNodeTimerID = startTimer(100);
firmwareFile.close();
}else{
QMessageBox::warning(this,"Warning","Open file error!");
}
}
void MainWindow::timerEvent(QTimerEvent * event)
{
if(event->timerId() == scanNodeTimerID){
onlineCheck();
}
}
void MainWindow::onlineCheck(void)
{
VCI_CAN_OBJ CAN_ReadData[200];
VCI_CAN_OBJ CAN_SendData;
int ret,i,k;
QString mac_str;
QString str;
ret = VCI_Receive(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_ReadData[0],
200);
for(k=0;k<ret;k++){
if((CAN_ReadData[k].ID&0xF)==GET_ADDR){
mac_str.sprintf("%02X%02X%02X%02X%02X%02X%02X%02X",
CAN_ReadData[k].Data[0],CAN_ReadData[k].Data[1],
CAN_ReadData[k].Data[2],CAN_ReadData[k].Data[3],
CAN_ReadData[k].Data[4],CAN_ReadData[k].Data[5],
CAN_ReadData[k].Data[6],CAN_ReadData[k].Data[7]);
for(i=1;i<128;i++){
if(can_addr.local_addr[i]==0){
can_addr.local_addr[i] = i;
for(int j=0;j<8;j++){
can_addr.mac_addr[i][j] = CAN_ReadData[k].Data[j];
CAN_SendData.Data[j] = CAN_ReadData[k].Data[j];
}
CAN_SendData.DataLen = 8;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
CAN_SendData.ID = (i<<4)|ADDR_OK;//設置從機地址
break;
}else if(mac_str==model->item(i-1,1)->text()){
for(int j=0;j<8;j++){
CAN_SendData.Data[j] = CAN_ReadData[k].Data[j];
}
CAN_SendData.DataLen = 8;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
CAN_SendData.ID = (i<<4)|ADDR_OK;//設置從機地址
break;
}else{
continue;
}
}
if(i==128){
CAN_SendData.DataLen = 0;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
CAN_SendData.ID = ADDR_ERROR;
}
ret = VCI_Transmit(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_SendData,
1);
if(ret!=1){
QMessageBox::warning(this,"Warning","Send Data Error!");
killTimer(scanNodeTimerID);
}else{
//將正確獲取到設備地址的節點在界面列表里面顯示出來
if((CAN_SendData.ID&0xF)!=ADDR_ERROR){
str.sprintf("%d",i);
model->item(i-1,0)->setText(str);
model->item(i-1,1)->setText(mac_str);
}
}
}
}
QCoreApplication::processEvents(QEventLoop::AllEvents);
//檢測在線狀態
for(i=0;i<model->rowCount();i++){
uint32_t local_addr,retry=0;
if(!model->item(i,0)->text().isEmpty()){
//清除之前接收的數據
VCI_ClearBuffer(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex());
local_addr = model->item(i,0)->text().toInt(NULL,0);
//發送在線檢測命令
CAN_SendData.DataLen = 0;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
CAN_SendData.ID = (local_addr<<4)|ONLINE_CHECK;
ret = VCI_Transmit(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_SendData,
1);
if(ret!=1){
QMessageBox::warning(this,"Warning","Send Data Error!");
}
retry = 0;
while(1){
ret = VCI_Receive(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_ReadData[0],
1);
if((ret==1)&&(local_addr==(CAN_ReadData[0].ID>>4))&&((CAN_ReadData[0].ID&0xF)==CMD_OK)){
mac_str.sprintf("%02X%02X%02X%02X%02X%02X%02X%02X",
CAN_ReadData[0].Data[0],CAN_ReadData[0].Data[1],
CAN_ReadData[0].Data[2],CAN_ReadData[0].Data[3],
CAN_ReadData[0].Data[4],CAN_ReadData[0].Data[5],
CAN_ReadData[0].Data[6],CAN_ReadData[0].Data[7]);
model->item(i,1)->setText(mac_str);
break;
}else{
if(retry<10){
Sleep(10);
retry++;
}else{
for(int c=0;c<model->columnCount();c++){
model->item(i,c)->setText("");
}
can_addr.local_addr[i+1]=0;
break;
}
}
}
}
}
QCoreApplication::processEvents(QEventLoop::AllEvents);
//獲取版本信息
for(i=0;i<model->rowCount();i++){
uint32_t local_addr,retry=0;
if(!model->item(i,0)->text().isEmpty()){
//清除之前接收的數據
VCI_ClearBuffer(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex());
local_addr = model->item(i,0)->text().toInt(NULL,0);
//發送在線檢測命令
CAN_SendData.DataLen = 0;
CAN_SendData.ExternFlag = 0;
CAN_SendData.RemoteFlag = 0;
CAN_SendData.SendType = 0;
CAN_SendData.ID = (local_addr<<4)|GET_VERSION;
ret = VCI_Transmit(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_SendData,
1);
if(ret!=1){
QMessageBox::warning(this,"Warning","Send Data Error!");
}
retry = 0;
while(1){
ret = VCI_Receive(VCI_USBCAN2,
ui->deviceIndexComboBox->currentIndex(),
ui->channelIndexComboBox->currentIndex(),
&CAN_ReadData[0],
1);
if((ret==1)&&(local_addr==(CAN_ReadData[0].ID>>4))&&((CAN_ReadData[0].ID&0xF)==GET_VERSION)){
str.sprintf("V%d.%d",CAN_ReadData[0].Data[0],CAN_ReadData[0].Data[1]);
model->item(local_addr-1,2)->setText(str);
break;
}else{
if(retry<10){
Sleep(10);
retry++;
}else{
break;
}
}
}
}
}
}
void MainWindow::on_openFilePushButton_clicked()
{
QString fileName;
fileName=QFileDialog::getOpenFileName(this,
tr("Open files"),
"",
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.png
(11.36 KB, 下載次數: 70)
下載附件
2018-10-22 17:41 上傳
所有資料51hei提供下載:
CAN Bootloader.rar
(440.04 KB, 下載次數: 68)
2018-10-21 20:53 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
xingchenlin
時間:
2019-10-16 13:03
很實用!
作者:
sZhou
時間:
2019-11-12 20:12
我下載了以后,解壓不了,顯示‘文件格式未知或者數據已經損壞’
請發一份我QQ郵箱:號871854638
謝!
作者:
lucelu
時間:
2019-12-4 16:09
正在學習CAN總線,學習一下
作者:
bouna
時間:
2020-3-19 19:42
thank you
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1