1 Star 2 Fork 3

bms / libcontrolcan2

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

README

多路 CAN <--> TCP/IP 转发器:can_agent + libControlCan.so/libControlCan.dll。使用 Boost.Asio 实现跨平台支持:

  • Windows 10/7
  • Linux/Ubuntu
  • Arm Linux

CAN 设备接收数据可通过 Socket 转发给多个客户端(主要实现Receive);同时 Socket 客户端可以通过 Transmit 发送消息到 CAN 设备。

Socket客户端依赖 libControlCan.so/libControlCan.dll 实现通讯,且可以使用 libControlCan.dll 替换周立功 can_test 中的同名dll,使得周立功 can_test 转为通过 can_agent 访问 USBCAN设备。

底层支持的CAN设备:

  • 周立功 USB CAN II 设备;
  • 其他兼容周立功 USB CAN II 的设备,及升级型号;

代码结构:

|
|-- include : libControlCAN API头文件,高性能bytes/text转换
|-- libControlCAN : CAN <--> Socket 透传实现lib
|-- can_agent : Socket agent 服务
|-- test : Boost.Asio TCP/UDP, eventpp, zmq, CAN收发, CAN/Socket透传测试及demo
|-- asio_example : Boost.Asio 学习测试代码

使用 eventpp(MCMP)实现数据分发,性能测试结果pdf:can_agent performance

1. 开发环境

  • VS2022扩展(Windows):Clang Power Tools ;
  • VS2022扩展(Windows):Format Document On Save ;
  • 依赖安装的 boost >= 1.79;
  • 3rd -- gtest源码 v1.11.0
  • 3rd -- glog源码 v0.6.0

2. 编译选项

  1. 编译选项 ENABLE_PROFILER :使能链接 gperftools profiler。

3. 自带第三方库的编译

3.1 gtest源码目录相对于官方gtest仓库修改

  • googletest/CMakeLists.txt:set(GOOGLETEST_VERSION 1.11.0),否则找不到GOOGLETEST_VERSION会报错;
  • googletest/cmake/internal_utils.cmake:函数cxx_library_with_type中更改 RUNTIME_OUTPUT_DIRECTORY 等变量的路径为 CMAKE_ARCHIVE_OUTPUT_DIRECTORY ,使输出路径与父CMakeLists.txt保持一致。
  • googletest/CMakeLists.txt:添加 set(gtest ${gtest} PARENT_SCOPE),让test目录能够依赖于gtest之后编译;
  • googletest/CMakeLists.txt:gtest,gtest_main 静态编译修改为 cxx_shared_library 动态编译。

3.2 glog源码相对于官方glog的修改

# 3rd/glog-0.6.0/CMakeLists.txt
set(BUILD_TESTING OFF)
set(glog ${glog} PARENT_SCOPE)

configure_file (src/glog/logging.h.in glog/logging.h @ONLY) # 在该语句后面添加如下两条
configure_file (src/glog/log_severity.h glog/log_severity.h @ONLY)
configure_file (src/glog/platform.h glog/platform.h @ONLY)

set(GLOG_PUBLIC_H
# ...
) # 在该语句下面添加一条语句
set(GLOG_INC_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE)

# 注释掉如下语句
# set(CMAKE_DEBUG_POSTFIX d)

在根CMakeLists.txt中添加:

include_directories(${GLOG_INC_DIR})

3.3 引入libzmq,辅助测试代码引用libzmp

  • 注释掉 RELEASE_POSTFIX , RELWITHDEBINFO_POSTFIX , MINSIZEREL_POSTFIX , DEBUG_POSTFIX ,并且测试例程针对Windows 链接名称为 libzmq;
  • BUILD_TESTS 设置为 OFF;
  • WITH_LIBSODIUM 设置为 OFF;
  • WITH_LIBBSD 设置为 OFF;
  • BUILD_STATIC 设置为 OFF,否则Windows编译报错(与BUILD_SHARED二选一);
  • set(ZeroMQ ${ZeroMQ} PARENT_SCOPE);
  • WITH_DOCS 位置为 OFF;

3.4 boost编译适用于libControlCAN.so的静态库

Linux Windows Boost编译命令

./boostrap.sh
./b2 -layout=versioned variant=release cxxflags='-fPIC -std=c++17' runtime-link=static link=static threading=multi
sudo ./b2 install
# 删除系统安装的boost
sudo apt-get --purge remove libboost-dev
sudo apt-get --purge remove libboost-all-dev

4. 官方glog使用vs2022编译命令

cmake .. -G "Visual Studio 17 2022" -A Win32 -DCMAKE_BUILD_TYPE="Release" -DBUILD_SHARED_LIBS="ON" -DCMAKE_INSTALL_BINDIR="bin" -DCMAKE_INSTALL_SBINDIR="bin" -DCMAKE_INSTALL_LIBEXECDIR="bin" -DCMAKE_INSTALL_LIBDIR="lib" -DCMAKE_INSTALL_INCLUDEDIR="include" -DCMAKE_INSTALL_DATAROOTDIR="share" -DCMAKE_EXPORT_NO_PACKAGE_REGISTRY="ON" -DWITH_THREADS="True" -DWITH_SYMBOLIZE="True" -DWITH_UNWIND="True" -DBUILD_TESTING="False"

5. Windows 仅使用命令行编译

cmake -G "Visual Studio 17 2022" -A Win32 -S ./ -B "build32"
# cmake --build build32 --config Release --clean-first -j
cmake --build build32 --config Release -j

CMake Build a Project

6. 编译问题解决

  1. 编译libControlCAN时,出现 relocation against in read-only section。是由于系统安装了多个版本的boost导致,添加 **link_directories("/usr/local/lib")**覆盖系统boost安装位置。
  2. Windows编译时,导出__stdcall函数时,导出符号带有_Func_Name@num,需要将def文件带入源文件一起编译;

7. 编译资源文件参考

8. 代码clang-format全部格式化

find . -regex '.*\.\(cc\|cpp\|hpp\|cu\|c\|h\)' -exec clang-format -style=file -i {} \;

代码检查:Extra Clang Tools 16.0.0git documentation

9. 代码静态检查

python run-clang-tidy.py -p ./build -config-file .clang-tidy -quiet

在代码中,使用NOLINT等(以及带参数的版本)标注禁用静态检查。

// NOLINT
// NOLINTNEXTLINE

// NOLINTBEGIN
// NOLINTEND

10. 参考

11. 引用第三方库

12. template相关参考

13. template std::true_type std::false_type

#include <type_traits>
#include <iostream>
/* https://ideone.com/469YTq */

template<typename T>
void use_impl(const T&, std::false_type) {
 std::cout << "use_impl(false)" << std::endl;
}

template<typename T>
void use_impl(const T&, std::true_type) {
 std::cout << "use_impl(true)" << std::endl;
}

template<typename T>
void use(const T& v) {
   use_impl(v, typename std::is_integral<T>::type());
}

int main() {
   use(1);
   use(1.2);
}
MIT License Copyright (c) 2022 vaughnHuang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

跨平台CANBUS/TCP透传。 1. boost asio 2. eventpp 高性能线程安全事件回调 3. boost spsc 消息队列 4. 集成glog/googletest; 5. zmq,没有用上,性能不够,功能不满足。 展开 收起
C++ 等 6 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C++
1
https://gitee.com/huirun_bms_desktop/libcontrolcan2.git
git@gitee.com:huirun_bms_desktop/libcontrolcan2.git
huirun_bms_desktop
libcontrolcan2
libcontrolcan2
master

搜索帮助