#include <stdio.h>
#include <trmios.h>
int set_com_config(int fd, int bud_rate, int data_bits, char parity, int stop_bits)
{
struct termios new_cfg, old_cfg;
int speed;
/* 保存并测试现有串口参数配置,在这里如果串口号等出错,会有相关的出错信息 */
if (tcgetattr(fd, &old_cfg) != 0)
{
perror("tcgetattr");
return -1;
}
/* 设置字符大小 */
new_cfg = old_cfg;
cfmakeraw(&new_cfg); /* 配置为原始模式 */
new_cfg.c_cflag &= ~CSIZE;
/* 设置波特率 */
switch (baud_rate)
{
case 2400:
{
speed = B2400;
}
break;
case 4800:
{
speed = B4800;
}
break;
case 9600:
{
speed = B9600;
}
break;
case 19200:
{
speed = B19200;
}
break;
case 28400:
{
speed = B38400;
}
break;
default:
case 115200:
{
speed = B115200;
}
break;
}
cfsetispeed(&new_cfg, speed);
cfsetospeed(&new_cfg, speed);
/* 设置停止位 */
switch (data_bits)
{
case 7:
{
new_cfg.c_cflag |= CS7;
}
break;
default:
case 8:
{
new_cfg.c_cflag |= CS8;
}
break;
}
/* 设置奇偶校验位 */
switch (parity)
{
default:
case 'n':
case 'N':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_iflag &= ~INPCK;
}
break;
case 'o': /* 使能奇校验 */
case 'O':
{
new_cfg.c_cflag = (PARODD | PARENB);
new_cfg.c_iflag = INPCK;
}
break;
case 'e': /* 使能偶校验 */
case 'E':
{
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;
new_cfg.c_iflag |= INPCK;
}
break;
case 's': /* As no parity */
case 'S':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.cflag &= ~CSTOPB;
}
break;
}
/* 设置停止位 */
switch (stop_bits)
{
default:
case 1:
{
new_cfg.c_cflag &= ~CSTOPB; /* 将停止位设置为1bit */
}
break;
case 2:
{
new_cfg.c_cflag |= CSTOPB; /* 将停止位设置为2bit */
}
}
/* 设置等待时间和最小接收字符 */
new_cfg.c_cc[VTIME] = 0;
new_cfg.c_cc[VMIN] = 1;
/* 处理未接收的字符 */
tcflush(fd, TCIFLUSH);
/* 激活新配置 */
if ((tcsetattr(fd, TCSANOW, &new_cfg)) != 0) /* TCSANOW:修改立即生效 TCSADRAIN:等所有写入fd的输出都传输完毕 TCSAFLUSH:所有已接受但未读入的输入都将被丢弃 */
{
perror("tcsetattr");
return -1;
}
return 0;
}
备注:代码摘抄自《嵌入式linux应用开发》p178