Linux C++ 串口通信 读数据

首先,确认串口的波特率,数据位,停止位,校验位等信息

编写代码,在Linux中运行,读数据,使用串口调试工具发送,在代码端接收。

#include <iostream>
#include <sys/select.h>
#include <errno.h>
#include <cstring>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义
#include <chrono>

#define BUF   "hello world!"
int main(int argc, char **argv)
{
	int m_fd = -1;
	int count = -1;
	char m_portName[] = "/dev/ttyS6";//串口名称
	m_fd = open(m_portName, O_RDWR|O_NOCTTY|O_NDELAY);//打开串口设备
	//O_RDWR 通过读写的方式打开文件
	//O_NOCTTY 该程序不会成为串口的控制终端
	//O_NDELAY 不关心DCD信号线的状态
	if (m_fd == -1) {
		std::cout << "failed to open serial" << std::endl;
		return false;
	}
	struct termios options;//通过该接口修改串口参数
	// struct termios
	// {
	// 	tcflag_t  c_iflag;  //输入选项
	// 	tcflag_t  c_oflag;  //输出选项
	// 	tcflag_t  c_cflag;  //控制选项
	// 	tcflag_t  c_lflag;  //行选项
	// 	cc_t      c_cc[NCCS]; //控制字符
	// }
	count = tcgetattr(fd, &options);//获取原有的串口属性的配置

	if(count == -1)
	{
		std::cout << "failed" << std::endl;
	}
	options.c_cflag|=(CLOCAL|CREAD);//CREAD开启串行数据接收,CLOCAL并打开本地连接模式
	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
	// ICANON 规范模式标志
	// ECHO 回显输入字符标志
	// ECHOE 回显擦除字符标志
	// ISIG 信号使能标志
	options.c_cflag &= ~CSIZE;//通过CSIZE做位屏蔽
	options.c_cflag |= CS8;//设置8位数据位
	options.c_cflag &= ~PARENB;//无校验位

	/*设置115200波特率*/
	cfsetispeed(&options,B115200);//设置输入波特率
	cfsetospeed(&options,B115200);//设置输出波特率

	options.c_cflag &= ~CSTOPB;//设置一位停止位

	options.c_cc[VTIME] = 0;//非规范模式读取时的超时时间
	options.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数

	tcflush(m_fd, TCIFLUSH);//清除输入缓冲区
	tcflush(m_fd, TCOFLUSH);//清除输出缓冲区

	count = tcsetattr(fd, TCSANOW, &options);//设置终端的属性

	int strRead = -1;
	while (1) {
		char bufferR[256] = {0};
		strRead = read(m_fd, bufferR, sizeof(bufferR) - 1);
		if (strRead < 0) {
			std::cout << "error" << std::endl;
		} else if (strRead == 0) {
			std::cout << "no data" << std::endl;
		} else {
			for (int i = 0; i < strRead; i++) {
				std::cout << bufferR[i];
			}
		}
		std::this_thread::sleep_for(std::chrono::seconds(5));
	}
	close(m_fd);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值