当前位置: 首页 > article >正文

libserailport交叉编译适配说明

1:libserialport简介

github路径
自己的gitee路径
libserialport 是一个跨平台的串口通信库,由 sigrok 项目开发。它简洁、易用,并且支持多种操作系统。

libserialport 支持阻塞和非阻塞模式,可以根据你的需求选择适当的模式。阻塞模式下,操作会等待完成或超时,而非阻塞模式下,操作会立即返回。通过使用 sp_blocking_* 和 sp_nonblocking_* 函数,你可以轻松实现这两种模式。

2:交叉编译脚本

1:将下面的代码保存为一个脚本,使用source执行;
2:注意先修改 CROSS_COMPILE 和 prefix 路径;
3:编译步骤请参考编译说明;

#!/bin/bash

# 源码地址 https://github.com/sigrokproject/libserialport


#export CROSS_COMPILE=<交叉编译工具链前缀>
export CROSS_COMPILE=/opt/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export AS=${CROSS_COMPILE}as
export LD=${CROSS_COMPILE}ld
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip
echo "cross ok"

# 编译说明
# 1: 先执行 make clean 
#    source build.sh,注意修改交叉编译工具链
# 2:执行 ./autogen.sh
# 3: 修改交叉编译工具链和生成目标文件路径
#    ./configure --enable-tools=yes --host=aarch64-linux-gnu --prefix=/home/djq/mokar/cv2x_libs/libserialport-0.1.1/targets/
# 4:make
# 5:make install
# 6:libserialport-0.1.1/targets/ 路径下会生成目标文件

3: libserialport对比系统自带的read和write优势

libserialport 和直接使用系统自带的 read 和 write 函数来操作串口设备在功能和便利性上有一些区别。以下是一些主要的区别和考虑因素:

  1. 易用性
    libserialport: 提供了更高级的抽象,简化了串口的打开、配置和通信操作。处理串口通信时,开发者不需要深究底层细节,如设置串口参数和处理各种可能的错误。
    系统自带的 read 和 write: 需要开发者手动处理串口的打开、配置、参数设置以及错误处理。尽管更灵活,但容易出错且代码更复杂。
  2. 跨平台支持
    libserialport: 设计之初就考虑了跨平台支持,能在 Linux、Windows 和 macOS 上运行而无需修改代码。这对需要跨平台兼容的项目非常有用。
    系统自带的 read 和 write: 这些是 POSIX 标准函数,主要在 Unix/Linux 系统上原生支持。要在其他操作系统上使用,可能需要额外的工作。
  3. 功能扩展
    libserialport: 提供了更丰富的功能库,如列出系统中可用的串口、设置和获取串口参数、阻塞和非阻塞读写操作、事件通知等。
    系统自带的 read 和 write: 只提供基本的读写功能。若要实现高级功能(比如列出串口、流控等),需要额外编写大量代码。
  4. 代码简洁性
    libserialport: 提供了更简洁的 API,减少了重复代码,提高了代码的可读性和维护性。
    系统自带的 read 和 write: 需要写更多的样板代码来实现同样的功能。例如,配置串口需要手动使用 termios 结构体和相关函数。
  5. 错误处理
    libserialport: 内置了更好的错误处理机制,可以方便地进行错误检测和处理。
    系统自带的 read 和 write: 需要手动处理每一个系统调用的返回值,并进行相应的错误处理。

http://www.kler.cn/news/311679.html

相关文章:

  • 胤娲科技:解锁AI奥秘——产品经理的智能进化之旅
  • 【每天学点AI】一个例子带你了解Python装饰器到底在干嘛!
  • C语言中的一些小知识(二)
  • Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
  • 算法题总结(三)——滑动窗口
  • MySql的基础讲解
  • Fisco Bcos 2.11.0配置console控制台2.10.0及部署调用智能合约
  • SpringAI-基于java大模型的胡言乱语
  • 正则表达式获取某些字段
  • docker快速搭建kafka
  • 【C++ Primer Plus习题】16.9
  • ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
  • 数据结构---二叉树例题讲解
  • 基于深度学习的手势识别算法(论文复现)
  • Vue使用组件需要加前缀而React使用组件库的区别
  • 单片机毕业设计基于单片机寻迹巡线避障智能小车系统设计
  • .NET 一直跻身 30 大Github最活跃开源项目之列。
  • JDK自带的序列化
  • sqli-labs靶场搭建
  • 鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3566移植案例
  • Datawhile 组队学习Tiny-universe Task01
  • 数据结构-2.8.单链表的建立
  • 【Spring】IocDI详解(6)
  • VMWare17.5.2中Windows7企业版安装VMWareTools失败及解决办法
  • stm32单片机个人学习笔记3(GPIO输出)
  • Python 正则表达式详解:从基础匹配到高级应用
  • 华为OD机试 - 构成指定长度字符串的个数(Python/JS/C/C++ 2024 E卷 100分)
  • <<编码>> 第 14 章 反馈与触发器(7)--分频器与计数器 示例电路
  • 提升工作效率,引领编程新时代
  • 【大模型开发】 迎接AI新时代:Qwen2.5发布,超越LLaMA3!本地私有化部署:如何通过一键API调用不同模型?(附源码地址)