全能串行通信库-serial库

Serial库是一个面向对象的跨平台串行通信库。它提供了一个简单而一致的接口,以处理各种串行协议。这篇文章将从以下多个方面详细阐述serial库的特点和使用方法。

一、初始化串行通信

对于串行通信设备,如何初始化才能使用?在使用serial库之前,需要对串行口设置进行初始化。这些设置包括波特率、数据位、停止位、校验位等,如下所示:

#include "serial/serial.h"

serial::Serial my_serial("/dev/ttyUSB0", 115200, serial::Timeout::simpleTimeout(1000));

void init_serial()
{
    my_serial.setBaudrate(9600);
    my_serial.setBytesize(serial::eightbits);
    my_serial.setParity(serial::parity_none);
    my_serial.setStopbits(serial::stopbits_one);
}

这里创建了一个名为my_serial的串行通信对象,将其绑定到设备/dev/ttyUSB0上,并设置波特率为115200。之后调用my_serial的四个函数,依次设置数据位、校验位和停止位。需要注意的是,在设置完这些参数之后,还需要调用setBaudrate()函数重新设置波特率,以保证波特率设置正确。

二、读写串行数据

串行通信是双向的,用户需要能够读取来自串行设备的数据,同时还需要向其发送数据。为此,serial库提供了以下两个函数:

size_t read(uint8_t *buf, size_t size);
size_t write(const uint8_t *data, size_t length);

read()函数从串行口中读取数据,将其存储在缓冲区中,然后返回实际读取的字节数。用户需要提供缓冲区指针和要读取的字节数。write()函数将数据写入串行口,需要提供发送数据的指针和字节数。下面是一个例子:

void serial_write_data()
{
    std::string write_data("Hello, world!");
    my_serial.write(write_data);
}

void serial_read_data()
{
    std::vector read_data;
    read_data.resize(10);
    size_t bytes_read = my_serial.read(read_data.data(), 10);
}

这里的serial_write_data()函数将字符串”Hello, world!”写入串行口,而serial_read_data()函数从串行口中读取了10个字节的数据存储在read_data中。

三、控制串行通信流

有时候,当没有足够的数据时,读取操作会被阻塞。在这种情况下,根据用户需求进行流的控制非常重要。serial库提供了以下控制函数,以控制流的状态:

void flushInput();
void flushOutput();
void flush();
void pause();
void resume();

flushInput()函数清除输入缓冲区,flushOutput()清除输出缓冲区,flush()函数清除输入输出缓冲区。pause()和resume()将控制通信流。调用pause()时,串行口将不再读取或写入数据。调用resume()时,流将恢复,并尝试建立新的连接。下面是一个例子:

void serial_control_flow()
{
    my_serial.pause();    // pause the flow
    my_serial.flushInput(); // clear input buffer
    my_serial.flushOutput();    // clear output buffer
    my_serial.resume();   // resume the flow
}

四、串行端口信息

串行口的一些信息,如其设备名称、波特率等,对于一些应用程序而言是非常重要的。serial库提供了以下函数来获取这些信息:

std::string getPort() const;
uint32_t getBaudrate() const;
uint8_t getBytesize() const;
uint8_t getParity() const;
uint8_t getStopbits() const;
bool isOpen() const;

getPort()函数返回串行通信对象使用的设备名称。getBaudrate()返回当前波特率,getBytesize()返回数据位,getParity()返回校验位类型,getStopbits()返回停止位类型,而isOpen()函数则检查端口是否已打开。下面是一个例子:

void serial_port_info()
{
    std::string port_name = my_serial.getPort();
    uint32_t baudrate = my_serial.getBaudrate();
    uint8_t bytesize = my_serial.getBytesize();
    uint8_t parity = my_serial.getParity();
    uint8_t stopbits = my_serial.getStopbits();
    bool is_open = my_serial.isOpen();
}

五、错误处理

由于串行通信与硬件相关,因此在使用过程中可能会出现错误。serial库提供了以下几种错误处理方式:

enum SerialExceptionType
{
    timeout,
    port_not_open,
    already_open,
    open_failed,
    configuration_failed,
    read_failed,
    write_failed,
    ioctl_failed,
    other_error
};

class SerialException : public std::exception
{
public:
    SerialException() : type_(other_error){}
    SerialException(const SerialExceptionType& type) : type_(type){}
    virtual const char *what() const noexcept override
    {
        return "serial exception";
    }
    virtual const char *type() const noexcept
    {
        switch (type_)
        {
            case timeout:
                return "timed out";
            case port_not_open:
                return "port not open";
            case already_open:
                return "port already open";
            case open_failed:
                return "failed to open port";
            case configuration_failed:
                return "failed to configure port";
            case read_failed:
                return "read failed";
            case write_failed:
                return "write failed";
            case ioctl_failed:
                return "ioctl failed";
            case other_error:
            default:
                return "other error";
        }
    }
    SerialExceptionType type() const noexcept
    {
        return type_;
    }
private:
    SerialExceptionType type_;
};

SerialException作为serial库的异常类,提供了几种错误类型。例如timeout表示读或写操作因超时而失败,port_not_open表示串行端口未被打开,already_open表示已经打开的端口再次被打开,open_failed表示打开端口失败,configuration_failed表示无法对端口进行正确的配置,而read_failed和write_failed表示读或写操作失败。

六、总结

serial库是一个功能强大且易于使用的库,非常适合处理各种串行通信协议。它提供了一些重要的功能,如初始化通信、读写通信、控制通信流、获取串行端口信息和错误处理等。使用serial库能够让用户轻松地进行串行通信。code示例:

#include "serial/serial.h"

serial::Serial my_serial("/dev/ttyUSB0", 115200, serial::Timeout::simpleTimeout(1000));

void init_serial()
{
    my_serial.setBaudrate(9600);
    my_serial.setBytesize(serial::eightbits);
    my_serial.setParity(serial::parity_none);
    my_serial.setStopbits(serial::stopbits_one);
}

void serial_write_data()
{
    std::string write_data("Hello, world!");
    my_serial.write(write_data);
}

void serial_read_data()
{
    std::vector read_data;
    read_data.resize(10);
    size_t bytes_read = my_serial.read(read_data.data(), 10);
}

void serial_control_flow()
{
    my_serial.pause();
    my_serial.flushInput();
    my_serial.flushOutput();
    my_serial.resume();
}

void serial_port_info()
{
    std::string port_name = my_serial.getPort();
    uint32_t baudrate = my_serial.getBaudrate();
    uint8_t bytesize = my_serial.getBytesize();
    uint8_t parity = my_serial.getParity();
    uint8_t stopbits = my_serial.getStopbits();
    bool is_open = my_serial.isOpen();
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/242591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:50
下一篇 2024-12-12 12:50

相关推荐

  • 跨域通信浮标——实现客户端之间的跨域通信

    本文将介绍跨域通信浮标的使用方法,该浮标可以实现客户端之间的跨域通信,解决了浏览器同源策略的限制,让开发者能够更加方便地进行跨域通信。 一、浮标的原理 跨域通信浮标的原理是基于浮动…

    编程 2025-04-27
  • 通信专业Python和Java的开发技巧

    本文旨在介绍通信专业Python和Java的开发技巧,为读者提供实用且可操作的思路和方法。 一、Python在通信领域中的应用 Python是一种优秀的程序设计语言,因其易学易用、…

    编程 2025-04-27
  • ROS通信

    一、概述 ROS是机器人操作系统,是一个开源的、灵活的、分布式的软件平台,可以帮助我们快速开发机器人应用程序。ROS中的通信是机器人应用程序开发中最重要的部分之一,它是实现多模块协…

    编程 2025-04-25
  • Python 进程通信

    当需要在不同进程之间进行通信时,Python 提供了几种方法来实现进程间通信。这些方法包括队列,管道,共享内存以及套接字。 1. 队列 Python 队列是进程安全的,并且可以很方…

    编程 2025-04-24
  • TIPC:多节点通信的高效解决方案

    一、TIPC概述 TIPC是一个Linux内核中的通信协议,在多节点通信场景下拥有出色的表现,被许多公司使用。 TIPC协议支持传输层的连接管理、拥塞控制、流量调整等高级特性,对于…

    编程 2025-04-24
  • c#串口通信数据读取

    一、基础概念 串口通信是指通过串口进行数据交换的过程。串口是指COM口,COM口是计算机硬件设备之一,其可进行异步数据传输,因此能方便地进行数据收发,被广泛应用于各种领域中。 串口…

    编程 2025-04-24
  • ROS串口通信详解

    一、ROS介绍 ROS(Robot Operating System)是一个开源的机器人操作系统,为机器人软件开发提供了很多功能包,如导航、定位、感知等。 ROS主要基于发布/订阅…

    编程 2025-04-24
  • Vue组件之间的通信方式

    在Vue.js中,组件是构建应用程序的基本单元。每个Vue组件都是一个自包含的功能模块,它可以通过props和事件在父组件和子组件之间进行通信。以下是几种在Vue组件之间进行通信的…

    编程 2025-04-23
  • 可靠传输:保障通信的基础

    在网络通信中,可靠传输是非常重要的一环。它保证了数据的完整性、可靠性和正确性,使得通信双方能够实现稳定、高效、准确的信息交换。从以下几个方面来阐述可靠传输的实现过程和实现方法。 一…

    编程 2025-04-23
  • QT USB通信详细介绍

    一、USB通信的介绍 USB(Universal Serial Bus)是一种全新的、高速的、热插拔、双向传输的外部总线标准。在这种传输方式下,一个计算机上最多能插置127台USB…

    编程 2025-04-23

发表回复

登录后才能评论