📄 democandlg.cpp
字号:
}
void CDemoCANDlg::OnButtonSend()
{
VCI_CAN_OBJ sendbuf[1];
UpdateData(TRUE);
CString str5[32];
BYTE buf[50];
BYTE SendID[10];
CString strtemp,strtemp1;
CString str1;
int len,datanum=0,IDnum=0,newflag=1;
len=m_strSendID.GetLength(); //from dialog
for(int i=0; i<len;i++)
{
strtemp=m_strSendID.GetAt(i);
if(strtemp==" ")
newflag=1;
else if(newflag==1)
{
newflag=0;
strtemp=m_strSendID.GetAt(i);
if(i==(len-1))
{
str5[IDnum]="0"+strtemp;
}
else
{
strtemp1=m_strSendID.GetAt(i+1);
if(strtemp1 == " ")
str5[IDnum]="0"+strtemp;
else
str5[IDnum]=strtemp+strtemp1;
}
SendID[IDnum]=Str2Hex(str5[IDnum]);
IDnum++;
if(IDnum>=4)
break;
}
}
newflag=1;
len=m_strSendData.GetLength();
for(i=0; i<len;i++)
{
strtemp=m_strSendData.GetAt(i);
if(strtemp==" ")
newflag=1;
else if(newflag==1)
{
newflag=0;
strtemp=m_strSendData.GetAt(i);
if(i==(len-1))
{
str5[datanum]="0"+strtemp;
}
else
{
strtemp1=m_strSendData.GetAt(i+1);
if(strtemp1 == " ")
{
str5[datanum]="0"+strtemp;
}
else
str5[datanum]=strtemp+strtemp1;
}
buf[datanum]=Str2Hex(str5[datanum]);
datanum++;
if(datanum>=8)
break;
}
}
sendbuf->ExternFlag=m_nSendFrameType;
sendbuf->DataLen=datanum;
sendbuf->RemoteFlag=m_nSendFrameFormat;
if(m_nSendFrameFormat==1)//if remote frame, data area is invalid
for(i=0;i<datanum;i++)
buf[i]=0;
BYTE SendID2[4];
if((sendbuf->ExternFlag)==1)//
{
if(m_radioIDFormat)//direcet id to SJA1000 format
{
SendID[0] &= 0x1F;
SendID2[0]=(SendID[0]<<3)|(SendID[1]>>5);
SendID2[1]=(SendID[1]<<3)|(SendID[2]>>5);
SendID2[2]=(SendID[2]<<3)|(SendID[3]>>5);
SendID2[3]=(SendID[3]<<3);
for(i=0;i<4;i++)
sendbuf->ID[i]=SendID2[i];
// sendbuf->ID=(SendID2[0]<<24)+(SendID2[1]<<16)+(SendID2[2]<<8)+SendID2[3];
}
else
{
SendID[3]=SendID[3] & 0xF8;//the last 3bit is invalid, clear to 0
for(i=0;i<4;i++)
sendbuf->ID[i]=SendID[i];
// sendbuf->ID=(SendID[0]<<24)+(SendID[1]<<16)+(SendID[2]<<8)+SendID[3];
}
}
else//basic frame ID
{
if(m_radioIDFormat)//
{
SendID[2] &= 0x07;
SendID2[0]=(SendID[2]<<5)|(SendID[3]>>3);
SendID2[1]=SendID[3]<<5;
for(i=0;i<2;i++)
sendbuf->ID[i]=SendID2[i];
}
else
{
SendID[1]=SendID[1] & 0xE0;//the lower 5 bits is invalid,clear to 0
for(i=0;i<2;i++)
sendbuf->ID[i]=SendID[i];
}
}
for(i=0;i<datanum;i++)
sendbuf->Data[i]=buf[i];
int flag;
if((m_nCanIndex==1)&&(m_DevType!=DEV_USBCAN200))
{
MessageBox("the device only support CAN index 0");
m_nCanIndex=0;
}
flag=VCI_Transmit(m_DevType,m_DevIndex,m_nCanIndex,sendbuf);//CAN message send
if(flag<1)
{
if(flag==-1)
MessageBox("failed- device not open\n");
else if(flag==0)
MessageBox("send error\n");
return;
}
CSize size;
unsigned int JustnowItem;
BYTE data;
CString strTime;
SYSTEMTIME systime;
GetLocalTime(&systime);
strTime.Format("%02d:%02d:%02d:%03d", systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds);
size.cx=0;
size.cy=50;
CString str;
str.Format("%d",nextrow);
m_list.ItemColorFlag[nextrow]=1;
JustnowItem=m_list.InsertItem(nextrow,str);
nextrow++;
m_list.SetItemText(JustnowItem,1,strTime);
str.Format("%d",m_nCanIndex);
m_list.SetItemText(JustnowItem,2,str);
m_list.SetItemText(JustnowItem,3,"Send");
str="";
if((sendbuf->RemoteFlag)==1)
{
m_list.SetItemText(JustnowItem,5,"Remote");
}
else
{
m_list.SetItemText(JustnowItem,5,"Data");
}
if((sendbuf->ExternFlag)==1)
{
for(i=0;i<4;i++)
{
data=SendID[i];
str1.Format("%02X",data);
str+=str1;
}
m_list.SetItemText(JustnowItem,4,str);
m_list.SetItemText(JustnowItem,6,"Extended"); //
}
else
{
for(i=0;i<2;i++)
{
if(m_radioIDFormat)//direct id to sja1000 format
data=SendID[i+2];
else
data=SendID[i];
str1.Format("%02X",data);
str+=str1;
}
m_list.SetItemText(JustnowItem,4,str);
m_list.SetItemText(JustnowItem,6,"Standard"); //
}
str.Format("%d",sendbuf->DataLen);
m_list.SetItemText(JustnowItem,7,str);
str="";
for(i=0;i<sendbuf->DataLen;i++)
{
data=sendbuf->Data[i];
str1.Format("%02X",data);
str+=str1+" ";
}
m_list.SetItemText(JustnowItem,8,str);
m_list.Scroll(size);
}
UINT CDemoCANDlg::ReceiveThread(LPVOID v)
{
CDemoCANDlg *dlg=(CDemoCANDlg*) AfxGetApp()->GetMainWnd();
int k=0;
while(1)
{
int NumValue;
int i;
VCI_CAN_OBJ pCanObj[200];
CString strbuf[200],str1;
int num=0;
CSize size;
unsigned int JustnowItem;
BYTE ReceivedID[4];
size.cx=0;
size.cy=50;
CString str;
int Len=0;
NumValue=VCI_Receive(dlg->m_DevType,dlg->m_DevIndex,0,pCanObj);
k++;
CString strTime;
SYSTEMTIME systime;
GetLocalTime(&systime);
strTime.Format("%02d:%02d:%02d:%03d", systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds);
for(num=0;num<NumValue;num++)
{
if(nextrow==59999)
{
dlg->m_list.DeleteAllItems();
nextrow=0;
}
dlg->m_list.ItemColorFlag[nextrow]=0;
str.Format("%d",nextrow);
JustnowItem=dlg->m_list.InsertItem(nextrow,str);
nextrow++;
dlg->m_list.SetItemText(JustnowItem,1,strTime);
// str.Format("%d",nCanIndex);
dlg->m_list.SetItemText(JustnowItem,2,"0");
dlg->m_list.SetItemText(JustnowItem,3,"Receive");
str="";
if((pCanObj[num].RemoteFlag)==1)
{
dlg->m_list.SetItemText(JustnowItem,5,"Remote");
}
else
{
dlg->m_list.SetItemText(JustnowItem,5,"Data");
}
if((pCanObj[num].ExternFlag)==1)
{
for(i=0;i<4;i++)
ReceivedID[i]=pCanObj[num].ID[i];
if(dlg->m_radioIDFormat)//from sja1000 format to direct id
{
ReceivedID[3]=(ReceivedID[2]<<5)|(ReceivedID[3]>>3);
ReceivedID[2]=(ReceivedID[1]<<5)|(ReceivedID[2]>>3);
ReceivedID[1]=(ReceivedID[0]<<5)|(ReceivedID[1]>>3);
ReceivedID[0]=ReceivedID[0]>>3;
}
for(i=0;i<4;i++)
{
str1.Format("%02X",ReceivedID[i]);
str+=str1;
}
dlg->m_list.SetItemText(JustnowItem,4,str); //ID信息
dlg->m_list.SetItemText(JustnowItem,6,"Extended"); //
}
else //标准帧
{
for(i=0;i<2;i++)
ReceivedID[i]=pCanObj[num].ID[i];
if(dlg->m_radioIDFormat)//将CAN2.0B格式进行转换到直接ID值
{
ReceivedID[1]=(ReceivedID[1]>>5)|(ReceivedID[0]<<3);
ReceivedID[0]=ReceivedID[0]>>5;
}
for(i=0;i<2;i++)
{
str1.Format("%02X",ReceivedID[i]);
str+=str1;
}
dlg->m_list.SetItemText(JustnowItem,4,str); //ID信息
dlg->m_list.SetItemText(JustnowItem,6,"Standard"); //
}
str.Format("%d",pCanObj[num].DataLen); //长度信息
dlg->m_list.SetItemText(JustnowItem,7,str);
str="";
for(i=0;i<(pCanObj[num].DataLen);i++) //数据信息
{
str1.Format("%02X ",pCanObj[num].Data[i]);
str+=str1;
}
dlg->m_list.SetItemText(JustnowItem,8,str);
dlg->m_list.Scroll(size);
}
Sleep(10);
if(StopFlag==1)
return 0;
}
return 1;
}
void CDemoCANDlg::OnCheckCanrxEn()
{
UpdateData(TRUE);
if(m_bCanRxEn)
{
StopFlag=0;
AfxBeginThread(ReceiveThread,0);
}
else
StopFlag=1;
}
void CDemoCANDlg::OnButtonCreateExcel()
{
CString m_strFileName;
CString sPath;
CFileDialog dlg(FALSE, "xls", NULL,
OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,
"Excel File(*.xls)|*.xls||", this);
dlg.m_ofn.lpstrTitle = _T("File save Dialog");
if ( dlg.DoModal() == IDOK )
sPath = dlg.GetPathName();
else
return;
m_strFileName = dlg.GetFileName();
CString sDsn;
CString sExcelFile;
int nPos;
nPos=sPath.ReverseFind ('\\');
sPath=sPath.Left (nPos);
sExcelFile = sPath +"\\"+ m_strFileName;
int i=0;
// 新建Excel文件名及路径,TestSheet为内部表名
CSpreadSheet SS(sExcelFile, "canlog",false);
CStringArray sampleRows, testRow;
SS.BeginTransaction();
sampleRows.RemoveAll();
sampleRows.Add("Seq");
sampleRows.Add("Time");
sampleRows.Add("CANInd");
sampleRows.Add("Orentation");
sampleRows.Add("ID");
sampleRows.Add("Frame");
sampleRows.Add("Type");
sampleRows.Add("DLC");
sampleRows.Add("DATA");
SS.AddHeaders(sampleRows,true);
CString str[10]={"10","11","12","13","14","15","16","17","18","19"};
int nCount = m_list.GetItemCount();
for(i=0; i<nCount; i++)
{
sampleRows.RemoveAll();
for(int j=0; j<9; j++)
{
str[j]=m_list.GetItemText(i,j);
sampleRows.Add(str[j]);
}
SS.AddRow(sampleRows);
}
SS.Commit();
AfxMessageBox("Excel Write Finished!");
}
void CDemoCANDlg::OnButtonClear()
{
m_list.DeleteAllItems();
}
/////////////////////////////////////////////////////////////////////////////
CString GetExcelDriver()
{
char szBuf[2001];
WORD cbBufMax = 2000;
WORD cbBufOut;
char *pszBuf = szBuf;
CString sDriver;
if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
return "";
do
{
if (strstr(pszBuf, "Excel") != 0)
{
sDriver = CString(pszBuf);
break;
}
pszBuf = strchr(pszBuf, '\0') + 1;
}
while (pszBuf[1] != '\0');
return sDriver;
}
UINT CDemoCANDlg::SendThread(LPVOID v)
{
CDatabase database;
CString sSql;
CString sDriver;
CString sDsn;
sDriver = GetExcelDriver();
if (sDriver.IsEmpty())
{
AfxMessageBox("no drive!");
return 0;
}
VCI_CAN_OBJ sendbuf1[2];
int i=0;
CDemoCANDlg *dlg=(CDemoCANDlg*) AfxGetApp()->GetMainWnd();//获得对话框
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
CString sItem[10];
database.Open(NULL, false, false, sDsn);
CRecordset recset(&database);
sSql = "SELECT * FROM canlog" ;
recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
CString str2;
while (!recset.IsEOF())
{
if(StopFlag==1)
return 0;
i++;
sendbuf1->DataLen=8;
sendbuf1->Data[0]=i;
sendbuf1->ExternFlag=1;
sendbuf1->RemoteFlag=0;
sendbuf1->ID[0]=0x80;
sendbuf1->ID[1]=0x80;
sendbuf1->ID[2]=0x80;
sendbuf1->ID[3]=0x80;
int flag=VCI_Transmit(dlg->m_DevType,dlg->m_DevIndex,0,sendbuf1);//CAN数据发送
if(flag!=1)
{
if(flag==-1)
AfxMessageBox("failed, device not open\n");
else
AfxMessageBox(" send fail\n");
return 0;
}
CSize size;
unsigned int JustnowItem;
BYTE data;
CString strTime;
SYSTEMTIME systime;
GetLocalTime(&systime);
strTime.Format("%02d:%02d:%02d:%03d", systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds);
size.cx=0;
size.cy=50;
CString str;
str.Format("%d",nextrow);
dlg->m_list.ItemColorFlag[nextrow]=1;
JustnowItem=dlg->m_list.InsertItem(nextrow,str);
nextrow++;
dlg->m_list.SetItemText(JustnowItem,1,strTime);
dlg->m_list.SetItemText(JustnowItem,2," 0");
dlg->m_list.SetItemText(JustnowItem,3,"Send"); //方向
/* dlg->m_list.SetItemText(JustnowItem,5,sItem[5]); // 数据/远程
dlg->m_list.SetItemText(JustnowItem,4,sItem[4]); //ID信息
dlg->m_list.SetItemText(JustnowItem,6,sItem[6]); //标准/扩展
dlg->m_list.SetItemText(JustnowItem,7,sItem[7]); //长度信息
dlg->m_list.SetItemText(JustnowItem,8,sItem[8]); //数据信息
*/
dlg->m_list.Scroll(size);
if(dlg->m_DevType==DEV_USBCAN200)
{
flag=VCI_Transmit(dlg->m_DevType,dlg->m_DevIndex,1,sendbuf1);//CAN数据发送
if(flag!=1)
{
AfxMessageBox("failed\n");
return 0;
}
GetLocalTime(&systime);
strTime.Format("%02d:%02d:%02d:%03d", systime.wHour,systime.wMinute,systime.wSecond,systime.wMilliseconds);
size.cx=0;
size.cy=50;
str.Format("%d",nextrow);
dlg->m_list.ItemColorFlag[nextrow]=1;//list Item颜色标记
JustnowItem=dlg->m_list.InsertItem(nextrow,str); //插入行,顺序号
nextrow++;
dlg->m_list.SetItemText(JustnowItem,1,strTime); //显示位置定义
dlg->m_list.SetItemText(JustnowItem,2," 1"); //显示CANINDEX
dlg->m_list.SetItemText(JustnowItem,3,"Send"); //方向
dlg->m_list.Scroll(size);
}
recset.MoveNext();
}
database.Close();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -