使用的USB转CAN的设备是周立功的USBCAN-II,在购买的时候,会有上位机二次开发的库文件、例程和API文档等材料,可以参考。
1、库函数的调用
首先,把库函数文件都放在工作目录下。库函数文件总共有三个文件:ControlCAN.h、ControlCAN.lib、ControlCAN.dll和一个文件夹kerneldlls。
VC调用动态库的方法
(1) 在扩展名为.CPP的文件中包含ControlCAN.h头文件。
如:#include “ControlCAN.h”
(2) 在工程的连接器设置中连接到ControlCAN.lib文件。
如:在VC7环境下,在项目属性页里的配置属性→连接器→输入→附加依赖项中添加ControlCAN.lib
中间换了一台电脑,出现电脑丢失ControlCAN.dll的问题,将ControlCAN.dll拷到了可执行文件的文件夹中即可
2、基本操作
2.1 连接设备
我这里每次连接都会重新开启接收数据的线程,创建一次接收数据的txt文档
void CTest_OilDlg::OnBnClickedButtonConnect() { //首先判断CAN是否打开,,如果已经打开,则先复位及重启CAN--1.8 //关闭程序前必须点击断开连接按钮,否则报错 if(m_connect == 1) { m_connect = 0; //isShow = 0; Sleep(500); GetDlgItem(IDC_BUTTON_CONNECT)->SetWindowTextW(_T("连接")); VCI_CloseDevice(m_deviceType,m_deviceIndex); showListInfo(_T("断开设备成功")); //结束自发自收测试的定时器 KillTimer(0); //结束当前线程 if(m_pThread != NULL) { //::WaitForSingleObject(m_pThread->m_hThread,INFINITE);//该函数会造成死锁 //https://blog.csdn.net/silvervi/article/details/5874212 将上面函数修改成如下,以避免上面函数阻塞对话框主线程的消息队列 DWORD dwRet = 0; MSG msg; while(true) { //等待处理数据线程结束,和等待消息队列中的任何消息 dwRet = MsgWaitForMultipleObjects(1,&m_pThread->m_hThread,false,INFINITE,QS_ALLINPUT); //dwRet = WaitForSingleObject(m_pThread->m_hThread,50); switch (dwRet) { case WAIT_OBJECT_0: break; case WAIT_OBJECT_0 + 1: //get the message from Queue and dispatch it to specific window PeekMessage(&msg,NULL,0,0,PM_REMOVE); DispatchMessage(&<