USB串口操作(C,C++)

本文介绍了在Ubuntu环境下,使用C和C++语言进行USB串口的读写操作。C语言部分通过open、tcgetattr、tcsetattr等函数配置串口参数,C++部分则利用Boost.ASIO库进行串口通信。示例代码展示了如何设置波特率、数据位、停止位和校验位,以及读写数据的基本方法。
摘要由CSDN通过智能技术生成

我们在日常使用过程中经常需要对USB串口进行一些读写操作,这里记录一下C,C++两种语言的操作过程.

注意:作者使用的环境为Ubuntu,在windows系统中使用需要对应把ttyUSB转换为COM口.

C语言读写USB串口

/* xiaochen open ttyUSB ------------------------------------------------------*/
int openttyUSB(char* path)
{
    int brate=9600,bsize=8,stopb=1;
    char *p,parity='N',dev[128],port[128],fctr[64]="";
    
    if ((p=strchr(path,':'))) {
        strncpy(port,path,p-path); port[p-path]='\0';
        sscanf(p,":%d:%d:%c:%d:%s",&brate,&bsize,&parity,&stopb,fctr);
    }
    else strcpy(port,path);
    
    sprintf(dev,"/dev/%s",port);
    int fd = open(dev, O_RDWR | O_NOCTTY);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    struct termios ios={0};
    tcgetattr(fd,&ios);
    /*设置波特率*/
    cfsetospeed(&ios, brate);
    cfsetispeed(&ios, brate);

    /*设置数据位、停止位和校验位等*/
    ios.c_cflag &= ~PARENB; /*清除校验位*/
    ios.c_cflag &= ~CSTOPB; /*使用一位停止位*/
    ios.c_cflag &= ~CSIZE;  /*清除数据位*/
    ios.c_cflag |= CS8;   /*设置数据位为 8*/

    if (tcsetattr(fd, TCSANOW, &ios) != 0) {
        perror("tcsetattr");
        return 1;
    }
    tcflush(fd,TCIOFLUSH);

    /*printf("path: %s \n", path);*/

    return fd;
}

/*调用  path = 'ttyUSB0:115200:8:N:1:off'*/
int fd = openttyUSB(path);
/*读取数据*/
unsigned char read_buf[256];
m_read = read(fd, read_buf, sizeof(read_buf));

/*写出数据*/
int bytes_written = write(fd, buff, strlen(buff));
if (bytes_written == -1) {
    fprintf(stderr, "写入数据失败\n");
    close(fd);
    return 1;
}
    

C++读写USB串口

/*boost*/
#include<boost/asio.hpp>
#include<boost/bind.hpp>


boost::asio::io_service io;
boost::asio::serial_port sp(io, serial_port);
sp.set_option( boost::asio::serial_port::baud_rate(baud_rate));
sp.set_option( boost::asio::serial_port::flow_control( boost::asio::serial_port::flow_control::none ) );
sp.set_option( boost::asio::serial_port::parity( boost::asio::serial_port::parity::none ) );
sp.set_option( boost::asio::serial_port::stop_bits( boost::asio::serial_port::stop_bits::one ) );
sp.set_option( boost::asio::serial_port::character_size( 8 ) );

// 读取数据
char read_once[1]={'\0'};
boost::asio::read(sp,boost::asio::buffer(read_once));

// 写出数据
boost::asio::write(sp,boost::asio::buffer(buff,buff_len));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓晨的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值