Qt 周立功USBCAN總線上位機
目的、要求
做一個USBCAN總線的shan上位機,使用周立功提供的SDK。要有參數設置的xu選項、接發數據、數據過濾等功能。
簡介
我這邊的CAN卡型號是USBCAN_4E_U,所以要使用USBCAN_4E_U這個dll。使用周立功提供的哪個dll,是根據你的CAN卡來決定的。周立功提供的vs2008編寫的MFC例子會起到一定的誤解。因爲那個例子直接使用了ControlCAN這個dll。在進行類型設置的時候選擇了31,也就是USBCAN_4E_U這個dll。而Qt用這樣的方法不行。
首先是Qt調用第三方的dll。有顯示和隱式2種方式。我這邊使用了顯示調用。剩下的就是加入頭文件,然後定義函數指針。然後根據周立功提供的開發文檔進行相應的開發。開發文檔對每個函數的使用和參數的含義做了詳細的解釋。
做對應開發的情況下,看你編譯器的版本,如果是64位,就選擇64位的dll。如果是32位就選擇32位的版本。大家千萬別用錯了,然後找不到原因。
配置方面大家可以參考這篇文章:https://www.cnblogs.com/judes/p/6952079.html
CAN的通訊都放在線程裏,通過信號與槽與UI界面進行交互
效果
代碼
void DataThread::transmitCanThread(QString idStr, QString chStr, int sendFrameTypeInt)
{
if(m_connect == false)
{
return;
}
char* id = idStr.toLatin1().data();
char* ch = chStr.toLatin1().data();
//QByteArray id = idStr.toLatin1();
//QByteArray ch = chStr.toLatin1();
VCI_CAN_OBJ frameinfo;
char szFrameID[9];
unsigned char FrameID[4]={0,0,0,0};
memset(szFrameID,'0',9);
unsigned char Data[8];
char szData[25];
BYTE datalen=0;
if(strlen(id) > 8)
{
qDebug() << "ID值超過範圍...";
emit sendStateInfoToUI("ID值超過範圍...");
return;
}
if(strlen(ch) > 24)
{
qDebug() << "數據長度超過範圍,最大爲8個字節...";
emit sendStateInfoToUI("數據長度超過範圍,最大爲8個字節...");
return;
}
if(sendFrameTypeInt == 0)
{
if(strlen(ch) % 3 == 1)
{
qDebug() << "數據格式不對,請重新輸入...";
emit sendStateInfoToUI("數據格式不對,請重新輸入...");
return;
}
}
memcpy(&szFrameID[8- strlen(id)],id,strlen(id));
strtodata((unsigned char*)szFrameID,FrameID,4,0);
datalen=(strlen(ch)+1)/3;
//strcpy(szData,(LPCTSTR)ch);
strcpy(szData,ch);
strtodata((unsigned char*)szData,Data,datalen,1);
frameinfo.DataLen = datalen;
memcpy(&frameinfo.Data,Data,datalen);
frameinfo.RemoteFlag = m_remoteFlag;
frameinfo.ExternFlag = m_externFlag;
if(frameinfo.ExternFlag==1)
{
frameinfo.ID=((DWORD)FrameID[0]<<24)+((DWORD)FrameID[1]<<16)+((DWORD)FrameID[2]<<8)+
((DWORD)FrameID[3]);
}
else
{
frameinfo.ID=((DWORD)FrameID[2]<<8)+((DWORD)FrameID[3]);
}
frameinfo.SendType=m_sendType;
int ret = pTransmitCAN(m_devtype,m_devind,m_canind,&frameinfo,1);
if(ret==1)
{
qDebug() << "寫入成功...";
emit sendStateInfoToUI("寫入成功...");
}
else
{
qDebug() << "寫入失敗...";
emit sendStateInfoToUI("寫入失敗...");
}
}
void DataThread::resetCanThread()
{
if(m_connect == false)
{
return;
}
if(pResetCAN(m_devtype,m_devind,m_canind) == STATUS_ERR)
{
qDebug() << "復位失敗";
emit sendStateInfoToUI("復位失敗");
pCloseDevice(m_devtype,m_devind);
}
else
{
qDebug() << "復位成功";
emit sendStateInfoToUI("復位成功");
}
}
void DataThread::run()
{
while(!m_stopped)
{
receiveCanThread();
}
m_stopped = false;
}
exe體驗地址(百度網盤鏈接):
鏈接:https://pan.baidu.com/s/1rGvkr4qMg9UypjqV_yFdyg
提取碼:0oac
[email protected] 備註博客標題