一、代码
1.SerialUtil.hpp
#include <string>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <thread>
#include <chrono>
#include <iostream>
using namespace std;
class SerialUtil
{
public:
int fd;
public:
/** @brief 打开设备
*/
int openSerial(const char *dev_name);
/** @brief 配置串口
*/
int configureSerial();
/** @brief 发送数据
*/
void sendSerial();
/** @brief 接受数据
*/
void listenSerial();
/** @brief 关闭串口
*/
void closeSerial();
};
2.SerialUtil.cpp
#include "SerialUtil.hpp"
int SerialUtil::openSerial(const char *dev_name)
{
this->fd = open(dev_name, O_RDWR | O_NOCTTY | O_NDELAY);
if (this->fd < 0)
{
cout << "打开失败:fd小于0\n";
return -1;
}
//恢复串口为阻塞状态
if (fcntl(this->fd, F_SETFL, 0) < 0)
{
cout << "打开成功:阻塞失败\n";
return -1;
}
else
{
cout << "打开成功>>>>>>" << endl;
return 1;
}
}
int SerialUtil::configureSerial()
{
struct termios port_settings; // 结构来存储端口设置
cfsetispeed(&port_settings, B115200); // 波特率
cfsetospeed(&port_settings, B115200); // 波特率
// 设置无奇偶校验,停止位,数据位
port_settings.c_cflag &= ~PARENB;
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
// 将设置应用到端口
tcsetattr(this->fd, TCSANOW, &port_settings);
cout << "配置成功>>>>>>" << endl;
return 1;
}
void SerialUtil::sendSerial()
{
int send_bytes[] = {11, 21, 3134};
// char send_bytes[] = {'a', 'b', 'c'};
// if (write(this->fd, send_bytes, sizeof(send_bytes) / sizeof(send_bytes[0])))
{
cout << "发送成功>>>>>>\n";
}
else
{
cout << "发送失败>>>>>>\n";
}
}
void SerialUtil::listenSerial()
{
int data[3];
// char data[3];
read(this->fd, data, sizeof(data) / sizeof(data[0]));
cout << "接受成功>>>>>>" << endl;
for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++)
{
cout << data[i] << " ";
}
cout << endl;
this_thread::sleep_for(chrono::milliseconds(5));
}
void SerialUtil::closeSerial()
{
close(this->fd);
cout << "已关闭串口>>>>>>\n";
}
3.main.cpp
#include <iostream>
#include "SerialUtil.hpp"
int main()
{
SerialUtil mySerial;
// /dev/ttyUSB0是你看到外设的端口名称
mySerial.openSerial("/dev/ttyUSB0");
mySerial.configureSerial();
mySerial.sendSerial();
mySerial.listenSerial();
mySerial.closeSerial();
return 0;
}
二、运行过程
1.查看端口
ls /dev
可以看到新增一个ttyUSB0
2.赋予外设读取权限
/dev/ttyUSB0
是你看到外设的端口名称
sudo chmod 777 /dev/ttyUSB0