树莓派串口配置(c++)


前言

最近做项目,在树莓派上用到串口来实现通信功能。所以用c++写了个串口的配置函数。。


提示:以下是本篇文章正文内容,下面案例可供参考

一、wiringPi库是什么?

wiringPi是一个树莓派GPIO控制开源库,安装后可以使用C语言调用相关的函数操作GPIO,如串口通信,中断,pwm控制等等。这里只列举串口通信。

二、使用步骤

1.安装库和接口介绍

https://www.cnblogs.com/lulipro/p/5992172.html

俗话说的好,要站在巨人的肩膀上才能走得更远。因为很多博主都有写库的安装和介绍的博客,就不一一介绍了,直接上链接。

2.C++串口配置

1.先写一个串口类
2.实现类成员函数
3.实例化调用

  1. Serialport类
#pragma once
#include <iostream>
#include "Lpr_Debug.h"
#include <wiringSerial.h>
class Serialport
{
    public:
    Serialport(const char *dev,int boundrate):Dev(dev),Boundrate(boundrate)
    {
        fd = 0;
        if(Dev == NULL)
        {
            SDK_PRINT(ERRORLEVEL,"Device pointer NULL\n");
        }
        if((fd = serialOpen(Dev,Boundrate))<0)
        {
            SDK_PRINT(ERRORLEVEL, "Fail to open %s\n", dev);
		    perror("Open device failed:");
        }
    }

    Serialport(){}      //默认构造函数
    ~Serialport();      //析构函数 关闭串口

    int serial_read_buffer(int fd, char *buf, unsigned int size);           //读取串口数据
    int serial_send_buffer(int fd, const char *buf, unsigned int len);      //串口发送数据
    void serial_send_char(int fd, char c);
    void wait_response(int fd);
    int get_fd();       //获取文件描述符
    protected:

    private:
    int fd;             //文件描述符
    const char *Dev;    //串口名
    int Boundrate;      //波特率
    
};
  1. 类成员函数实现
#include <Lpr_Serialport.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringSerial.h>
#include <Lpr_Debug.h>

Serialport::~Serialport()
{
    serialClose(fd);
}

int Serialport::serial_read_buffer(int fd, char *buf, unsigned int size)
{
    if (buf == NULL)
	{
		SDK_PRINT(ERRORLEVEL, "Buffer pointer NULL\n");
		return -1;
	}

	if (size == 0)
	{
		SDK_PRINT(ERRORLEVEL, "Read size is 0\n");
		return -1;
	}
	unsigned int i = 0;
	do
	{
		errno = 0;
		int tmp = serialGetchar(fd);
		if (tmp == -1)
		{
			if (errno == 0)
			{
				SDK_PRINT(DEBUGLEVEL, "No data to read\n");
				continue;
			}
			else
			{
				SDK_PRINT(DEBUGLEVEL, "Fail to read data from data port, %s\n", strerror(errno));
				exit(0);
			}
			
		}
		buf[i++] = tmp;
	} while (serialDataAvail(fd) > 0);
	return i;
}

int Serialport::serial_send_buffer(int fd, const char *buf, unsigned int len)
{
	if (buf == NULL)
	{
		SDK_PRINT(ERRORLEVEL, "Buffer pointer NULL\n");
		return -1;
	}

	unsigned int i = 0;
	while (len - i)
	{
		serialPutchar(fd, buf[i++]);
	}

	return i;
}

void Serialport::serial_send_char(int fd, char c)
{
	serialPutchar(fd, c);
}

void Serialport::wait_response(int fd)
{
	char buf[100] = "";
	unsigned char i = 0;
	while (serialDataAvail(fd) <= 0);
	while (serialDataAvail(fd) > 0)
	{
		buf[i++] = serialGetchar(fd);
	}
	serialFlush(fd); //把剩余未接收的数据清空
	SDK_PRINT(DEBUGLEVEL, "%s\n", buf);
}

int Serialport::get_fd()
{
	return fd;
}

3.主函数调用

    Serialport b("/dev/ttyUSB0",115200); //串口设备名 波特率
    while(1)
    {
        char buff[256]={0};
        int len = b.serial_read_buffer(b.get_fd(),buff,256);
        //SDK_PRINT(DEBUGLEVEL,"%s\n",buff);
        DroneDataHandle((char*)buff,len);//此处为对接收消息的解析,验证消息是否正确
    }

总结

对接收消息解析后打印结果正确在这里插入图片描述

注意点:

1.需要添加头文件#include <wiringSerial.h>
2.上例中打印函数没给出,可自己写
3.上例中的读写功能都已实现,可直接使用
4.串口设备名可通过命令行查看:ls -l /dev/tty*

  • 2
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在C语言中实现与树莓派串口通信,可以使用WiringPi库中的wiringSerial库。WiringPi是一个用C语言编写的树莓派软件包,用于树莓派GPIO引脚控制、串口通信、SPI通信和I2C通信等功能。请注意,WiringPi库的官方网址为http://wiringpi.com,不过这个库的作者已经停止维护了,所以建议使用其他更新的库来代替。 要进行串口通信,首先需要进行串口配置。可以按照以下步骤进行配置: 1. 首先,确保你已经安装了OpenCV的C环境,并且会使用cmake进行编译和运行。如果不会,请参考相关教程进行安装和配置。 2. 使用WiringPi库中的wiringSerial库来进行串口配置。具体的配置过程可以参考相关文档或教程,根据你的需求选择合适的串口和波特率等参数进行配置。 3. 在配置完成后,你就可以使用C语言中的串口读写函数来实现与树莓派串口通信了。通过调用相应的函数,你可以发送和接收数据。具体的函数使用方法可以参考WiringPi库的文档或相关教程。 需要注意的是,树莓派4B拥有额外的4个串口可以利用,默认配置好的硬件串口和miniUART可以保留设置,所以在树莓派4B上进行串口通信时,不需要将硬件串口设置为主串口并关闭蓝牙。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [树莓派4B基于OpenCV的C++环境的串口通信](https://blog.csdn.net/www_xuhss_com/article/details/124071653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值