给出Linux下打开串口函数
int open_tty(char tty[])
{
?int fd;
?char tty_path[32]={0};
?sprintf(tty_path,"/dev/%s",tty);
?fd=tty_open_port(tty_path);
?// PORT_SPEED是一个定义的宏,表示传输速率。数据位为8,无校验位,停止位为1
?tty_set_opt(fd,PORT_SPEED,8,'N',1);
?return fd;
}
该函数接受一个参数,表示你要打开的串口名称,如“ttyS1”,返回串口操作描述符,在调用该函数后,可以根据返回值来判断是否设置成功,如果fd大于0,则返回成功。?
该函数还依赖于两个函数,下面也给出(包括用到的头文件)。
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern int tty_open_port(char *tty_num);
extern int tty_set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop);
int tty_open_port(char *tty_num)
{
? ? int fd = open (tty_num, O_RDWR | O_NOCTTY | O_NDELAY );
? ? //阻塞 fcntl(fd,F_SETFL,0)? ; //block
? ? //非阻塞 fcntl(fd,F_SETFL,FNDELAY)? ;
? ? ? if (fd == -1)
? ? ? {
? printf ("Can't Open Serial Port %s !\n",tty_num);
? return -1;
? ? ? }
? ? ? else
? ? ? {
? ? //将串口设置成非阻塞的操作
? ? ? ? ? fcntl(fd,F_SETFL,FNDELAY);
? ? ? ? ? return fd;
? ? ? }
}
/**************************************************************************************
* 功? ? 能:set serial port speed
* 修改历史: 2011.6.29.
**************************************************************************************/
int tty_set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
?struct termios newtio,oldtio;
?if? ( tcgetattr( fd,&oldtio)!=0) {
? perror("SetupSerial 1");
? return -1;
?}
?bzero(&newtio, sizeof( newtio ));
?newtio.c_cflag? |=? CLOCAL | CREAD;
?newtio.c_cflag &= ~CSIZE;? ? ? ? ? ? //mask the character size bits
?switch( nBits )
?{
?case 7:
? newtio.c_cflag |= CS7;? ? ? ? ? ? ? //data: 7bits
? break;
?case 8:
? newtio.c_cflag |= CS8;? ? ? ? ? ? ? //data: 8bits
? break;
?}
?switch( nEvent )
?{
?case 'O':
? newtio.c_cflag |= PARENB;
? newtio.c_cflag |= PARODD;
? newtio.c_iflag |= (INPCK | ISTRIP);
? break;
?case 'E':
? newtio.c_iflag |= (INPCK | ISTRIP);
? newtio.c_cflag |= PARENB;
? newtio.c_cflag &= ~PARODD;
? break;
?case 'N':
? newtio.c_cflag &= ~PARENB;
? break;
?}
?switch( nSpeed )? ? ? ? ? //set the bps
?{
?case 2400:
? cfsetispeed(&newtio, B2400);
? cfsetospeed(&newtio, B2400);
? break;
?case 4800:
? cfsetispeed(&newtio, B4800);
? cfsetospeed(&newtio, B4800);
? break;
?case 9600:
? cfsetispeed(&newtio, B9600);
? cfsetospeed(&newtio, B9600);
? break;
?case 19200:
? cfsetispeed(&newtio, B19200);
? cfsetospeed(&newtio, B19200);
? break;
?case 115200:
? cfsetispeed(&newtio, B115200);
? cfsetospeed(&newtio, B115200);
? break;
?case 460800:
? cfsetispeed(&newtio, B460800);
? cfsetospeed(&newtio, B460800);
? break;
?default:
? cfsetispeed(&newtio, B9600);
? cfsetospeed(&newtio, B9600);
? break;
?}
?if( nStop == 1 )? ? ? ? ? ? ? ? //set the 1bit stop
? newtio.c_cflag &=? ~CSTOPB;
?else if ( nStop == 2 )? ? ? ? //set the 2bit stop
? newtio.c_cflag |=? CSTOPB;
?newtio.c_cc[VTIME]? = 0;
?newtio.c_cc[VMIN] = 0;
?tcflush(fd,TCIFLUSH);
?if((tcsetattr(fd,TCSANOW,&newtio))!=0)
?{
? perror("com set error");
? return -1;
?}
?printf("Current serial speed is %d\n",nSpeed);
?return 0;
}
代码中给出了可以设置成阻塞和非阻塞的操作。