linux串口通信(四):串口通信的可用代码


一、代码

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

3.cmake运行

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值