文档章节

CanOpen学习笔记2--Canfestival中加入自有设备驱动(VC2010编译)

b
 bo_zhang
发布于 2017/07/11 21:27
字数 878
阅读 136
收藏 1
点赞 0
评论 0

        这个东西花了我好长时间才搞好,编译错误、连接错误一大堆,主要是那个error LINK2019:无法解析外部符号,试了好多次才发现是C调用C++链接库是符号不匹配,因为编译时C编译和C++编译对函数名的处理是不一样的,导致无法找到外部符号。这里把解决方法提一下。

        这里主要参考了这两篇文章:C跟C++之间库的互相调用 - C++ (http://www.it2down.com/it-cpp/658024.htm) 和 C++调用C函数(http://blog.csdn.net/imcainiao11/article/details/7369447) 。由于C调用C++库和C++调用C库不一样,不能够简单添加extern “C”加以解决,需要对C++驱动库进行封装,即建立c++文件和头文件如下:

注意:函数名称及类型定义需要符合win32.c中需求。

注意这里的头文件usb2can.h的函数声明部分需要用extern “C”进行处理,C++文件可以不处理,调用C++编译的动态链接库的部分均在这个CPP文件中。将这两个文件加入CanFestival-3的头文件和源文件中,同时将库文件加入工程中,如下图所示:

注意头文件的目录要添加到属性中来

在win32.c中添加usb2can.h,同时定义#define NOT_USE_DYNAMIC_LOADING,再做出下列修改:即将CALLBACK去掉

// typedef UNS8 (CALLBACK* CANRECEIVE_DRIVER_PROC)(void* inst, Message *m);

// typedef UNS8 (CALLBACK* CANSEND_DRIVER_PROC)(void* inst, const Message *m);

// typedef void* (CALLBACK* CANOPEN_DRIVER_PROC)(s_BOARD *board);

// typedef int (CALLBACK* CANCLOSE_DRIVER_PROC)(void* inst);

// typedef UNS8 (CALLBACK* CANCHANGEBAUDRATE_DRIVER_PROC)(void* fd, char* baud);

typedef UNS8 (* CANRECEIVE_DRIVER_PROC)(void* inst, Message *m);

typedef UNS8 (* CANSEND_DRIVER_PROC)(void* inst, const Message *m);

typedef void* (* CANOPEN_DRIVER_PROC)(s_BOARD *board);

typedef int (* CANCLOSE_DRIVER_PROC)(void* inst);

typedef UNS8 (* CANCHANGEBAUDRATE_DRIVER_PROC)(void* fd, char* baud);

在can_driver.h中做下列修改:即注释掉驱动函数声明(在usb2can.h中代替)

// UNS8 DLL_CALL(canReceive)(CAN_HANDLE, Message *)FCT_PTR_INIT;

// UNS8 DLL_CALL(canSend)(CAN_HANDLE, Message const *)FCT_PTR_INIT;

// CAN_HANDLE DLL_CALL(canOpen)(s_BOARD *)FCT_PTR_INIT;

// int DLL_CALL(canClose)(CAN_HANDLE)FCT_PTR_INIT;

// UNS8 DLL_CALL(canChangeBaudRate)(CAN_HANDLE, char *)FCT_PTR_INIT;

编译即可生成库文件:CanFestival-3.lib  CanFestival-3.dll。对于需要这个库的应用工程中,需要在属性-》配置属性-》VC++目录中的库目录添加这两个库的所在目录以及头文件所在目录。

编译这个工程,若遇到1>win32test.obj : error LNK2001: 无法解析的外部符号 __nodeguardError这样的错误,需要打开CanFestival-3.def,添加_nodeguardError符号(注意前面只有一个下划线),重新编译即可。运行时exe文件和库文件要在同一个目录下。

后记:将CanFestival集成到MFC界面中,利用MFC界面进行控制

需要做的不多,首先将对象字典的源文件和头文件添加到工程中,将Canfestival的头文件复制到工程目录(便于管理)并添加到工程附加目录中如下图所示:

新建Master.c和Master.h文件,主要用于管理Canfestival的回调函数,也添加到工程中。将工程中的C文件(主要是OD源文件和Master.c)的属性改成不使用预编译头,以免出现错误。将Canfestival相关的头文件添加到cpp文件头部,并用extern “C”{}处理一下。最后将调用的库文件(CanFestival-3.lib)添加到工程中,如下图所示:

下面就可以在该cpp文件中调用CanFestival的函数了。注:图中的CanFestival-3项目不是必须的,这里只是为了方便查看修改,将原来的工程复制过来,并添加到这里。

© 著作权归作者所有

共有 人打赏支持
b
粉丝 0
博文 7
码字总数 6636
作品 0
苏州
Easy Code (笔记)CanOpen协议【CanFestival】移植方法 支持VC、QT、STM32

转载自:http://www.cnblogs.com/tdyizhen1314/p/4348725.html 前段时间学习了CanOpen协议,到网上下载的CanFestival3-10源码,移植到VC、QT、STM32等平台,由于网上的资源较少,走了不少弯路...

weixin_28900531 ⋅ 04/11 ⋅ 0

CANopen协议介绍

1.CANopen协议简介 从OSI 网络模型的角度来看,CAN总线只定义了OSI网络模型的第一层(物理层) 和第二层(数据链路层),而在实际设计中,这两层完全由硬件实现,设计人员无需再为此开发相关...

炉yu ⋅ 2017/06/14 ⋅ 0

RT-Thread 软件包介绍

1、软件包的目的 软件包在高级语言中非常常见,很多高级语言都有对应的软件包平台,比如 Python 的 PyPi,Ruby 的 Gems 等等。软件包生态对于一门语言的选择至关重要,因为这些软件包具有很强...

RTThread物联网操作系统 ⋅ 05/17 ⋅ 0

SylixOS-IgH系统平台搭建

1.参考手册 下面7个文件存放在本地服务器“\10.9.1.113.研发部9.ExchangeFolder郑磊”路径下 《RealEvo-IDE使用手册》 《SylixOS应用开发手册》 《SylixOSshell用户手册》 《SylixOS-IgH使用...

zhengleich ⋅ 05/15 ⋅ 0

VC 2008 Express下安装OpenCV2.3.1

VC 2008 Express下安装OpenCV2.3.1 注意: 下列文档以VC2008 Express为例,VC2010下的配置应与本文档类似。 VC 6.0不被OpenCV 2.3.1支持。 VC Express是微软提供的免费版,可从此处下载: ht...

Sophia_tj ⋅ 2012/09/07 ⋅ 0

4412开发板学习笔记---Linux驱动的学习方法

转自迅为iTOP-4412开发板实战教程书籍:http://www.topeetboard.com 1. Linux驱动的学习方法 Linux内核中有上百个驱动,知识点多且杂,对于想学习驱动的同学来说,需要尽快掌握基础知识:如开...

歌之王子殿下 ⋅ 2016/06/28 ⋅ 0

《Windows驱动开发技术详解》读书笔记(一)

首先需要安装DDK,这里我选择Microsoft Windows Server 2003 SP1 DDK Windows驱动分成两类,一类是不支持即插即用的NT式驱动,一类是支持即插即用的WDM驱动. 首先来看一个最简单的NT式驱动。...

嗯哼9925 ⋅ 01/07 ⋅ 0

KVM虚拟化技术 笔记(二)

半虚拟化驱动 KVM必须要求有硬件虚拟化辅助技术(Intel VT-x,AMD-V)的hypervisor (QEMU提供了全虚拟化环境 缺点:每次I/O操作路径较长,有较多的VMentry,VMExit,需要多次上下文切换,也需要...

拜仁慕尼黑 ⋅ 2014/01/27 ⋅ 0

驱动的定义、分类、安全性

以下内容源嵌入式课程的学习,如有侵权,请告知删除。 1、驱动的概念 狭义上,驱动程序专指操作系统中的用来操控硬件的代码。 2、linux体系架构 (1)分层思想; (2)驱动的上层是API(即应...

oqqHuTu12345678 ⋅ 2017/05/09 ⋅ 0

CppUnit学习笔记

今天是五一劳动节,为了不为全国人民添堵,本人还是决定宅在家里学点东西。 C++里的单元测试工具我接触过的有boost_unit,gtest。 本人深知单元测试的重要性与TDD(测试驱动开发)的思想。所...

临峰不畏 ⋅ 2015/05/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部