前言
最近做项目,在树莓派上用到串口来实现通信功能。所以用c++写了个串口的配置函数。。
提示:以下是本篇文章正文内容,下面案例可供参考
一、wiringPi库是什么?
wiringPi是一个树莓派GPIO控制开源库,安装后可以使用C语言调用相关的函数操作GPIO,如串口通信,中断,pwm控制等等。这里只列举串口通信。
二、使用步骤
1.安装库和接口介绍
https://www.cnblogs.com/lulipro/p/5992172.html
俗话说的好,要站在巨人的肩膀上才能走得更远。因为很多博主都有写库的安装和介绍的博客,就不一一介绍了,直接上链接。
2.C++串口配置
1.先写一个串口类
2.实现类成员函数
3.实例化调用
- 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; //波特率
};
- 类成员函数实现
#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*