首先,确认串口的波特率,数据位,停止位,校验位等信息
编写代码,在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;
}