上次我们使用STM32F072制作了一个USB的CAN选配器,可以进行简单的CAN收发功能 ,今天我们利用这个下位机制作一个DLL去替换周立功的ControlCan.dll,这样我们就可以直接使用以前编辑的周立功上位机了。

因为我们的下位机是HID模式,这里就用到了开源的HID上位机源代码

地址:https://github.com/signal11/hidapi

下载后,直接使用里面的hid.c和hidapi.h这两个文件加入到我们的工程中去使用。

1、打开VS,新建项目,这里选择控制台程序

下一步,选择DLL和空项目

2、把hid.c和hidapi.h加入工程,再新建controlcan.h和controlcan.c。

3、其中controlcan.h在周立功提供的库里可以找到,再做一些简单修改

#ifndef CONTROLCAN_H
#define CONTROLCAN_H//接口卡类型定义
#define VCI_PCI5121         1
#define VCI_PCI9810         2
#define VCI_USBCAN1         3
#define VCI_USBCAN2         4
#define VCI_USBCAN2A        4
#define VCI_PCI9820         5
#define VCI_CAN232          6
#define VCI_PCI5110         7
#define VCI_CANLITE         8
#define VCI_ISA9620         9
#define VCI_ISA5420         10
#define VCI_PC104CAN        11
#define VCI_CANETUDP        12
#define VCI_CANETE          12
#define VCI_DNP9810         13
#define VCI_PCI9840         14
#define VCI_PC104CAN2       15
#define VCI_PCI9820I        16
#define VCI_CANETTCP        17
#define VCI_PEC9920         18
#define VCI_PCIE_9220       18
#define VCI_PCI5010U        19
#define VCI_USBCAN_E_U      20
#define VCI_USBCAN_2E_U     21
#define VCI_PCI5020U        22
#define VCI_EG20T_CAN       23
#define VCI_PCIE9221        24
#define VCI_WIFICAN_TCP     25
#define VCI_WIFICAN_UDP     26
#define VCI_PCIe9120        27
#define VCI_PCIe9110        28
#define VCI_PCIe9140        29
#define VCI_USBCAN_4E_U     31
#define VCI_CANDTU_200UR    32
#define VCI_CANDTU_MINI     33
#define VCI_USBCAN_8E_U     34
#define VCI_CANREPLAY       35
#define VCI_CANDTU_NET      36
#define VCI_CANDTU_100UR    37//CAN错误码
#define ERR_CAN_OVERFLOW            0x0001  //CAN控制器内部FIFO溢出
#define ERR_CAN_ERRALARM            0x0002  //CAN控制器错误报警
#define ERR_CAN_PASSIVE             0x0004  //CAN控制器消极错误
#define ERR_CAN_LOSE                0x0008  //CAN控制器仲裁丢失
#define ERR_CAN_BUSERR              0x0010  //CAN控制器总线错误
#define ERR_CAN_BUSOFF              0x0020  //总线关闭错误
#define ERR_CAN_BUFFER_OVERFLOW     0x0040  //CAN控制器内部BUFFER溢出
//通用错误码
#define ERR_DEVICEOPENED            0x0100  //设备已经打开
#define ERR_DEVICEOPEN              0x0200  //打开设备错误
#define ERR_DEVICENOTOPEN           0x0400  //设备没有打开
#define ERR_BUFFEROVERFLOW          0x0800  //缓冲区溢出
#define ERR_DEVICENOTEXIST          0x1000  //此设备不存在
#define ERR_LOADKERNELDLL           0x2000  //装载动态库失败
#define ERR_CMDFAILED               0x4000  //执行命令失败错误码
#define ERR_BUFFERCREATE            0x8000  //内存不足//CANET错误码
#define ERR_CANETE_PORTOPENED       0x00010000  //端口已经被打开
#define ERR_CANETE_INDEXUSED        0x00020000  //设备索引号已经被占用
#define ERR_REF_TYPE_ID             0x00030000  //SetReference或GetReference传递的RefType不存在
#define ERR_CREATE_SOCKET           0x00030002  //创建Socket失败
#define ERR_OPEN_CONNECT            0x00030003  //打开Socket的连接时失败,可能设备连接已经存在
#define ERR_NO_STARTUP              0x00030004  //设备没启动
#define ERR_NO_CONNECTED            0x00030005  //设备无连接
#define ERR_SEND_PARTIAL            0x00030006  //只发送了部分的CAN帧
#define ERR_SEND_TOO_FAST           0x00030007  //数据发得太快,Socket缓冲区满了//函数调用返回状态值
#define STATUS_OK                   1
#define STATUS_ERR                  0#define CMD_DESIP                   0
#define CMD_DESPORT                 1
#define CMD_CHGDESIPANDPORT         2
#define CMD_SRCPORT                 2
#define CMD_TCP_TYPE                4  //tcp 工作方式,服务器:1 或是客户端:0
#define TCP_CLIENT                  0
#define TCP_SERVER                  1
//服务器方式下有效
#define CMD_CLIENT_COUNT            5  //连接上的客户端计数
#define CMD_CLIENT                  6  //连接上的客户端
#define CMD_DISCONN_CLINET          7  //断开一个连接
#define CMD_SET_RECONNECT_TIME      8  //使能自动重连
//CANDTU_NET支持GPS
#define CMD_GET_GPS                 9
#define CMD_GET_GPS_NUM             10 //获取GPS信息的数目typedef unsigned long       DWORD, ULONG;
typedef int                 INT;
typedef void*               HANDLE;
typedef unsigned char       BYTE;
typedef unsigned short      USHORT;
typedef char                CHAR;
typedef unsigned int        UINT;
typedef unsigned char       UCHAR;
typedef unsigned short      UINT16;
typedef void*               PVOID;typedef struct tagRemoteClient{int     iIndex;DWORD   port;HANDLE  hClient;char    szip[32];
}REMOTE_CLIENT;typedef struct _tagChgDesIPAndPort
{char    szpwd[10];char    szdesip[20];int     desport;BYTE    blistenonly;
}CHGDESIPANDPORT;//1.ZLGCAN系列接口卡信息的数据类型。
typedef  struct  _VCI_BOARD_INFO{USHORT  hw_Version;USHORT  fw_Version;USHORT  dr_Version;USHORT  in_Version;USHORT  irq_Num;BYTE    can_Num;CHAR    str_Serial_Num[20];CHAR    str_hw_Type[40];USHORT  Reserved[4];
} VCI_BOARD_INFO,*PVCI_BOARD_INFO;//2.定义CAN信息帧的数据类型。
typedef  struct  _VCI_CAN_OBJ{UINT    ID;UINT    TimeStamp;BYTE    TimeFlag;BYTE    SendType;BYTE    RemoteFlag;//是否是远程帧BYTE    ExternFlag;//是否是扩展帧BYTE    DataLen;BYTE    Data[8];BYTE    Reserved[3];    //Reserved[0] 第0位表示特殊的空行或者高亮帧
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;//3.定义CAN控制器状态的数据类型。
typedef struct _VCI_CAN_STATUS{UCHAR   ErrInterrupt;UCHAR   regMode;UCHAR   regStatus;UCHAR   regALCapture;UCHAR   regECCapture; UCHAR   regEWLimit;UCHAR   regRECounter; UCHAR   regTECounter;DWORD   Reserved;
}VCI_CAN_STATUS,*PVCI_CAN_STATUS;//4.定义错误信息的数据类型。
typedef struct _VCI_ERR_INFO{UINT    ErrCode;BYTE    Passive_ErrData[3];BYTE    ArLost_ErrData;
} VCI_ERR_INFO,*PVCI_ERR_INFO;//5.定义初始化CAN的数据类型
typedef struct _VCI_INIT_CONFIG{DWORD    AccCode;DWORD    AccMask;DWORD    Reserved;UCHAR    Filter;UCHAR    Timing0;UCHAR    Timing1;UCHAR    Mode;
}VCI_INIT_CONFIG,*PVCI_INIT_CONFIG;/ new add struct for filter /
typedef struct _VCI_FILTER_RECORD{DWORD   ExtFrame;   //是否为扩展帧DWORD   Start;DWORD   End;
}VCI_FILTER_RECORD,*PVCI_FILTER_RECORD;//定时自动发送帧结构
typedef struct _VCI_AUTO_SEND_OBJ{BYTE    Enable;     //使能本条报文 0:禁能 1:使能BYTE    Index;      //报文编号     最大支持32条报文DWORD   Interval;   //定时发送时间 1ms为单位VCI_CAN_OBJ obj;    //报文
}VCI_AUTO_SEND_OBJ,*PVCI_AUTO_SEND_OBJ;//设置指示灯状态结构
typedef struct _VCI_INDICATE_LIGHT{BYTE    Indicate;             //指示灯编号BYTE    AttribRedMode:2;      //Red LED灭/亮/闪烁/自控BYTE    AttribGreenMode:2;    //Green LED灭/亮/闪烁/自控BYTE    AttribReserved:4;     //保留暂时不用BYTE    FrequenceRed:2;       //Red LED闪烁频率BYTE    FrequenceGreen:2;     //Green LED闪烁频率BYTE    FrequenceReserved:4;  //保留暂时不用
} VCI_INDICATE_LIGHT,*PVCI_INDICATE_LIGHT;//设置转发结构
typedef struct _VCI_CAN_OBJ_REDIRECT{BYTE    Action;                //标识开启或停止转发BYTE    DestCanIndex;          //CAN目标通道
} VCI_CAN_OBJ_REDIRECT,*PVCI_CAN_OBJ_REDIRECT;typedef struct _CANDTUTIME {UINT16 wYear;UINT16 wMonth;UINT16 wDay;UINT16 wHour;UINT16 wMinute;UINT16 wSecond;
} CANDTUTIME;//GPS数据结构
typedef struct _tagCANDTUGPSData
{float       fLatitude;  //纬度float       fLongitude; //经度float       fSpeed;     //速度CANDTUTIME  candtuTime;
}CANDTUGPSData, *PCANDTUGPSData;//获取GPS结构
typedef struct _VCI_CANDTU_GPS_DATA
{PCANDTUGPSData pGPSData;    //用户提供接收GPS数据的缓冲区地址ULONG          nGPSDataCnt; //可以容纳的GPS数据个数
}VCI_CANDTU_GPS_DATA, *PVCI_CANDTU_GPS_DATA;#ifdef __cplusplus
#define EXTERNC extern "C" __declspec(dllexport)
#define DEF(a) = a
#else
#define EXTERNC
#define DEF(a)
#endifextern "C"
{
EXTERNC DWORD __stdcall VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved);
EXTERNC DWORD __stdcall VCI_CloseDevice(DWORD DeviceType,DWORD DeviceInd);
EXTERNC DWORD __stdcall VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig);EXTERNC DWORD __stdcall VCI_ReadBoardInfo(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo);
EXTERNC DWORD __stdcall VCI_ReadErrInfo(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_ERR_INFO pErrInfo);
EXTERNC DWORD __stdcall VCI_ReadCANStatus(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_STATUS pCANStatus);EXTERNC DWORD __stdcall VCI_GetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData);
EXTERNC DWORD __stdcall VCI_SetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData);EXTERNC ULONG __stdcall VCI_GetReceiveNum(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_ClearBuffer(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);EXTERNC DWORD __stdcall VCI_StartCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);
EXTERNC DWORD __stdcall VCI_ResetCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd);EXTERNC ULONG __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len);
EXTERNC ULONG __stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime DEF(-1));}#endif

4、control.c文件,主要是CAN的收发协议,其它的没有进行实现

#include "ControlCAN.h"
#include "hidapi.h"#ifdef WIN32
#include <windows.h>
#endif#include <stdio.h>
#include <stdlib.h>int res;
unsigned char sbuf[65];
unsigned char rbuf[65];
hid_device *handle;
int i;DWORD __stdcall VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved){res = hid_init();if(res == 0)return 1;elsereturn 0;}DWORD __stdcall VCI_CloseDevice(DWORD DeviceType,DWORD DeviceInd){hid_close(handle);res = hid_exit();return 1;}DWORD __stdcall VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig){handle = hid_open(0x1234, 0x5678, NULL);if(handle == 0)return 0;elsereturn 1;}DWORD __stdcall VCI_ReadBoardInfo(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo){return 1;}DWORD __stdcall VCI_ReadErrInfo(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_ERR_INFO pErrInfo){return 1;}DWORD __stdcall VCI_ReadCANStatus(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_STATUS pCANStatus){return 1;}DWORD __stdcall VCI_GetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData){return 1;}DWORD __stdcall VCI_SetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData){return 1;}ULONG __stdcall VCI_GetReceiveNum(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd){// res = hid_read_timeout(handle, rbuf, 20,0);res = 20;if(res == 20)return 1;elsereturn 0;}DWORD __stdcall VCI_ClearBuffer(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd){return 1;}DWORD __stdcall VCI_StartCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd){if(handle == 0)return 0;hid_set_nonblocking(handle,1);return 1;}DWORD __stdcall VCI_ResetCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd){return 1;}ULONG __stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len){if(handle == 0)return 0;sbuf[0] = 0;sbuf[5] = pSend->ExternFlag == 0?0:4;sbuf[6] = pSend->RemoteFlag==0?0:2;sbuf[7] = (byte)pSend->ID;sbuf[8] = (byte)(pSend->ID >> 8);sbuf[9] = (byte)(pSend->ID >> 16);sbuf[10] = (byte)(pSend->ID >> 24);sbuf[11] =  pSend->DataLen;for(i = 0;i<8;i++){sbuf[12+i] = pSend->Data[i];}res = hid_write(handle, sbuf, 21); return 1;}ULONG __stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime){//res = hid_read_timeout(handle, rbuf, 20,0);res = hid_read(handle, rbuf, 20);if(res == 20){UINT id = ((UINT)rbuf[9] << 24) + ((UINT)rbuf[8] << 16) + ((UINT)rbuf[7] << 8) + rbuf[6];pReceive->ID = id;pReceive->ExternFlag = rbuf[4] == 0?0:1;pReceive->RemoteFlag = rbuf[5] == 0?0:1;pReceive->DataLen = rbuf[10];for(i = 0;i<8;i++){pReceive->Data[i] = rbuf[i+11];}return 1;}else{return 0;}}

5、进行工程编译,生成的ControlCAN.dll,去替换以前写的周立功上位机,就可以使用了

stm32制作CAN适配器2--兼容使用周立功上位机相关推荐

  1. STM32驱动SDIO WIFI 介绍(十六) ---- 上位机UDP操作/代码

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

  2. STM32串口中断接收帧数据并返回给上位机总结(配合MAX3483)

    一.前言 这是我的第一篇CSDN,记录一些代码总结,一方面与大家分享交流,另一方面方便以后再次使用能够快速回忆,再就是提高自身写作水平.如有错误之处,欢迎各位大佬批评指正. 二.所涉及的芯片 1.ST ...

  3. STM32 MPU6050与匿名上位机通讯(V2.6版)

    0.系列目录 STM32 软件模拟IIC STM32 使用DMP库处理MPU6050数据 STM32 MPU6050与匿名上位机通讯(V2.6版) 1.简介 在四轴的调试中,经常要使用地面站与飞控之间 ...

  4. 利用STM32制作红外测温仪之软件设计(MLX90614)

    目录 (一)工程目录如图: (二)main函数实现: (三)MLX90614测温代码实现 前面介绍了使用 STM32制作红外测温仪硬件设计,今天来说一下软件的实现,具体的程序,完整的keil代码我已经 ...

  5. 不用自学APP开发:零基础也能制作APP软件,兼容iOS

    现在,我们总能在手机上发现很多有趣好玩的手机APP,自己也有一些不错的想法,想通过手机APP实现.网站.论坛的访问量越来越小,APP越来越重要.那么如何不用学习安卓APP开发入门教程就能开发一款APP ...

  6. 周立功阅读笔记-CANopen轻松入门基于DS301(一)

    周立功阅读笔记-CANopen轻松入门基于DS301(一) CANopen阅读笔记 4.CANopen的预定义报文和ID分类 5.对象字典OD(Object dictionary) 6.网络管理NMT ...

  7. 关于HA-MIR镜像双机虚拟IP与周立功CANET-200T采用UDP模式通讯技巧

    系统环境 Windows Server2008R2 Enterprise X64: 双机热备软件HA-MIR: CAN通讯模块采用周立功CANNET-200T: 实验说明 本实验通过笔记本搭建VMwa ...

  8. matlab制作以太网数据接收上位机_3D激光扫描仪设计及数据处理

    本文内容转载自<电子技术应用>2019年第10期,版权归<电子技术应用>编辑部所有. 段清明,王凡,徐琳琳,全文俊 吉林大学仪器科学与电气工程学院 摘要:利用2D激光雷达配合云 ...

  9. STM32+ESP8266连接电脑Qt网络上位机——QT篇

    本文简单介绍下手写网络调试器并连接ESP8266模块 上篇:  STM32+ESP8266连接电脑Qt网络上位机--准备工作 目录 一.部分Qt代码及实现过程 二.实现过程--使用ESP8266连接上 ...

  10. 用matlab结合STM32作上位机,基于stm32智能小车视觉控制导航的设计参考.pdf

    第 25 卷 第 9 期 电子设计工程 2017 年 5 月 Vol.25 No.9 Electronic Design Engineering May. 2017 基于STM32 智能小车视觉控制导 ...

最新文章

  1. C_functions
  2. gogs只支持mysql5.7_Gogs 搭建教程
  3. 神经风格迁移(Neural Style Transfer)程序实现(Keras)
  4. 计算理论2--可计算理论
  5. 机器学习训练秘籍完整中文版下载(吴恩达老师新作)
  6. [LOJ3153] 三级跳(单调栈 + 线段树)
  7. vs 如何将源文件转换成可执行文件_如何将手机便签转换成word文本文档
  8. 金士顿u盘真假软件_简洁轻巧 金士顿DT80 Type-C高速闪存盘评测
  9. Bailian3858 和数【暴力+集合】
  10. 编程基本功:BUG描述不要偷懒,不要误导
  11. python清洗数据去除停用词_python去除停用词(结巴分词下)
  12. OpenWrt-19.07.2 For HC5861(极路由3) /HiWiFi/Gee最新固件,极路由3刷openwrt
  13. 9针串口的RS232、RS485、RS422引脚定义
  14. 视频流媒体直播平台运行报Only one usage错误原因排查分析
  15. 【coppeliasim】高效传送带
  16. HIFI音频解码芯片ES9023
  17. Xinetd服务的安装与配置详解
  18. 【笑话】程序员的幽默,你可能看不懂 。。。
  19. adas测试工程师 车载
  20. 图书管理系统的设计与实现-毕业设计(论文)开题报告

热门文章

  1. Moore-Penrose广义逆矩阵
  2. 君正X1000串口流控bug
  3. SLC、MLC、TLC和QLC这几种存储颗粒的区别
  4. android12.0(S) Launcher3 去掉抽屉
  5. 【数据库】浅析Innodb的聚集索引与非聚集索引
  6. matplotlib画图教程系列之-堆积柱状图
  7. echarts 文本标签配置、label文字样式
  8. PCI-PCIE中断机制之三
  9. PCIe扫盲——PCI总线的三种传输模式
  10. julia集 matlab代码,Julia中文手册1.1版本