简易串口set_comport.c:
/*********************************************************************************
* Copyright: (C) 2018 Lingyunstudio
* All rights reserved.
*
* Filename: set_comport.c
* Description: This file
*
* Version: 1.0.0(04/28/2018)
* Author: guozhihao <810170156@qq.com>
* ChangeLog: 1, Release initial version on "04/28/2018 01:04:27 AM"
*
********************************************************************************/
/* head of sturct termios */
#include <termios.h>
#include <unistd.h>
/* head of perror */
#include <stdio.h>
#include <errno.h>
/* head of bzero() */
#include <strings.h>
/********************************************************************************
* Description:comport about ttyUSB0
* Input Args:fd=open("/dev/ttyUSB0",O_RDWR | O_NOCTTY | O_NDELAY) nspeed nBits:8 nEvent:N nStop:1
* Output Args:comport failure:return -1
* Return Value:
********************************************************************************/
int set_comport(int fd,int nSpeed,int nBits,char nEvent,int nStop) //串口设置,第一个传递文件描述符,第二个是设置异步通信的速率,第三个设置数据位,第四个设置校验位,第五个设置停止位;
{
struct termios newttyUSB0,oldttyUSB0; //设置新旧结构体
if(tcgetattr(fd,&oldttyUSB0) != 0) //保存原先串口配置
{
perror("Setupserial 1");
return -1;
}
bzero(&newttyUSB0,sizeof(newttyUSB0)); //将这个结构体中的内存区域的内容全清为0
newttyUSB0.c_cflag|=(CLOCAL|CREAD); //将c_cflag设置成开启串行接收模式,并且建立本地连接具体可参考下方的2.
newttyUSB0.c_cflag &=~CSIZE; //设置数据位
switch( nSpeed ) //波特率设置选项如2400,4800,9600,115200
{
case 2400:
cfsetispeed(&newttyUSB0,B2400); // 在设置波特率时需要在数字前加上’B’,如B9600,B15200
cfsetospeed(&newttyUSB0,B2400); //设置输出速率,上方的cfsetispeed则是设置输入速率
break;
case 4800:
cfsetispeed(&newttyUSB0,B4800);
cfsetospeed(&newttyUSB0,B4800);
break;
case 9600:
cfsetispeed(&newttyUSB0,B9600);
cfsetospeed(&newttyUSB0,B9600);
break;
case 115200:
cfsetispeed(&newttyUSB0,B115200);
cfsetospeed(&newttyUSB0,B115200);
break;
default:
cfsetispeed(&newttyUSB0,B115200);
cfsetospeed(&newttyUSB0,B115200);
break;
}
switch( nBits ) //选择数据位,如:CS7,CS8
{
case 7:
newttyUSB0.c_cflag |= CS7; //7位数据位
break;
case 8:
newttyUSB0.c_cflag |= CS8; //8位数据位
break;
}
switch( nEvent ) //设置校验位,如奇校验和偶校验
{
case '0':
newttyUSB0.c_cflag |= PARENB; //开启校验奇偶校验
newttyUSB0.c_iflag |= (INPCK | ISTRIP); //INPCK打开奇偶校验,ISTRIP去除字符的第八个
newttyUSB0.c_cflag |= PARODD; //启用奇校验,参数详细可参考下方2
break;
case 'E':
newttyUSB0.c_cflag |= PARENB; //开启校验奇偶校验
newttyUSB0.c_iflag |= (INPCK | ISTRIP); //INPCK打开奇偶校验,ISTRIP去除字符的第八个
newttyUSB0.c_cflag &= ~PARODD; //启用偶校验,参数详细可参考下方2
break;
case 'N':
newttyUSB0.c_cflag &= ~PARENB; //不启用奇偶校验
break;
}
if( 1 == nStop ) //停止位诺为1,则清除CSTOPB
{
newttyUSB0.c_cflag &= ~CSTOPB; //默认送一位停止位
}
else if ( 2 ==nStop )
{
newttyUSB0.c_cflag |= CSTOPB; //CSTOPB表示送两位停止位
}
/* 设置最少字符和等待时间,对于接收字符和等待时间没有特别的要求时 */
newttyUSB0.c_cc[VTIME] = 0; //非规范模式读取时间时的超时时间
newttyUSB0.c_cc[VMIN] = 0; //非规范模式读取时间时的最小字节数
tcflush(fd,TCIFLUSH); //清空终端未完成的输入和输出请求及数据;TCIFLUSH表示清空
/* 在完成配置后需要激活生效 */
if( (tcsetattr(fd,TCSANOW,&newttyUSB0)) != 0 ) //TCSANOW不等数据传输完毕就立即改变属性
{
perror("comport set error");
return -1;
}
return 0;
}
|