//serialport.h
- /*************************************************************
- FileName : serialport.h
- FileFunc : 定义头文件
- Version : V0.1
- Author : Sunrier
- Date : 2012-06-13
- Descp : Linux下实现串口库
- *************************************************************/
- #ifndef _SERIALPORT_H_
- #define _SERIALPORT_H_
- #ifdef __cplusplus
- extern "C" {
- #endif
- int open_port(int iPortNumber);
- int set_port(int fd,int iBaudRate,int iDataSize,char cParity,int iStopBit);
- int read_port(int fd,void *buf,int iByte);
- int write_port(int fd,void *buf,int iByte);
- int close_port(int fd);
- #ifdef __cplusplus
- }
- #endif
- #endif
//serialport.c
- /*************************************************************
- FileName : serialport.c
- FileFunc : 定义实现文件
- Version : V0.1
- Author : Sunrier
- Date : 2012-06-13
- Descp : Linux下实现串口库
- *************************************************************/
- /*#include "serialport.h"*/
- #include <stdio.h>
- #include <strings.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <termios.h>
- int open_port(int iPortNumber)
- {
- int fd = -1;
- char *pDev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3",
- "/dev/ttyS4","/dev/ttyS5","/dev/ttyS6","/dev/ttyS7",
- "/dev/ttyS8","/dev/ttyS9","/dev/ttyS10","/dev/ttyS11"};
- switch( iPortNumber )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- case 12:
- fd = open(pDev[iPortNumber-1],O_RDWR|O_NOCTTY|O_NDELAY);
- if( fd<0 )
- {
- perror("Can't Open Serial Port !");
- return (-1);
- }
- else
- {
- printf("Open ttyS%d ......\n",iPortNumber-1);
- }
- break;
- default:
- /*perror("Don't exist iPortNumber !");*/
- printf("Don't exist iPortNumber%d under /dev/? !\n",iPortNumber);
- return (-1);
- }
- if( fcntl(fd,F_SETFL,0)<0 )/*恢复串口的状态为阻塞状态,用于等待串口数据的读入*/
- {
- printf("fcntl failed !\n");
- return (-1);
- }
- else
- {
- printf("fcntl = %d !\n",fcntl(fd,F_SETFL,0));
- }
- /*测试打开的文件描述符是否应用一个终端设备,以进一步确认串口是否正确打开*/
- if( !isatty(STDIN_FILENO) )
- {
- printf("Standard input isn't a terminal device !\n");
- return (-1);
- }
- else
- {
- printf("It's a serial terminal device!\n");
- }
- printf("open_port file ID= %d !\n",fd);
- return fd;
- }
- int set_port(int fd,int iBaudRate,int iDataSize,char cParity,int iStopBit)
- {
- int iResult = 0;
- struct termios oldtio,newtio;
- iResult = tcgetattr(fd,&oldtio);/*保存原先串口配置*/
- if( iResult )
- {
- perror("Can't get old terminal description !");
- return (-1);
- }
- bzero(&newtio,sizeof(newtio));
- newtio.c_cflag |= CLOCAL | CREAD;/*设置本地连接和接收使用*/
- /*设置输入输出波特率*/
- switch( iBaudRate )
- {
- 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 38400:
- cfsetispeed(&newtio,B38400);
- cfsetospeed(&newtio,B38400);
- break;
- case 57600:
- cfsetispeed(&newtio,B57600);
- cfsetospeed(&newtio,B57600);
- break;
- case 115200:
- cfsetispeed(&newtio,B115200);
- cfsetospeed(&newtio,B115200);
- break;
- case 460800:
- cfsetispeed(&newtio,B460800);
- cfsetospeed(&newtio,B460800);
- break;
- default :
- /*perror("Don't exist iBaudRate !");*/
- printf("Don't exist iBaudRate %d !\n",iBaudRate);
- return (-1);
- }
- /*设置数据位*/
- newtio.c_cflag &= (~CSIZE);
- switch( iDataSize )
- {
- case 7:
- newtio.c_cflag |= CS7;
- break;
- case 8:
- newtio.c_cflag |= CS8;
- break;
- default:
- /*perror("Don't exist iDataSize !");*/
- printf("Don't exist iDataSize %d !\n",iDataSize);
- return (-1);
- }
- /*设置校验位*/
- switch( cParity )
- {
- case 'N': /*无校验*/
- newtio.c_cflag &= (~PARENB);
- break;
- case 'O': /*奇校验*/
- newtio.c_cflag |= PARENB;
- newtio.c_cflag |= PARODD;
- newtio.c_iflag |= (INPCK | ISTRIP);
- break;
- case 'E': /*偶校验*/
- newtio.c_cflag |= PARENB;
- newtio.c_cflag &= (~PARODD);
- newtio.c_iflag |= (INPCK | ISTRIP);
- break;
- default:
- /*perror("Don't exist cParity !");*/
- printf("Don't exist cParity %c !\n",cParity);
- return (-1);
- }
- /*设置停止位*/
- switch( iStopBit )
- {
- case 1:
- newtio.c_cflag &= (~CSTOPB);
- break;
- case 2:
- newtio.c_cflag |= CSTOPB;
- break;
- default:
- /*perror("Don't exist iStopBit !");*/
- printf("Don't exist iStopBit %d !\n",iStopBit);
- return (-1);
- }
- newtio.c_cc[VTIME] = 0; /*设置等待时间*/
- newtio.c_cc[VMIN] = 0; /*设置最小字符*/
- tcflush(fd,TCIFLUSH); /*刷新输入队列(TCIOFLUSH为刷新输入输出队列)*/
- iResult = tcsetattr(fd,TCSANOW,&newtio); /*激活新的设置使之生效,参数TCSANOW表示更改立即发生*/
- if( iResult )
- {
- perror("Set new terminal description error !");
- return (-1);
- }
- printf("set_port success !\n");
- return 0;
- }
- int read_port(int fd,void *buf,int iByte)
- {
- int iLen = 0;
- if( !iByte )
- {
- printf("Read byte number error !\n");
- return iLen;
- }
- iLen = read(fd,buf,iByte);
- return iLen;
- }
- int write_port(int fd,void *buf,int iByte)
- {
- int iLen = 0;
- if( !iByte )
- {
- printf("Write byte number error !\n");
- return iLen;
- }
- iLen = write(fd,buf,iByte);
- return iLen;
- }
- int close_port(int fd)
- {
- int iResult = -1;
- iResult = close(fd);
- return iResult;
- }
//demo.c
- /*************************************************************
- FileName : demo.c
- FileFunc : 测试串口应用
- Version : V0.1
- Author : Sunrier
- Date : 2012-06-13
- Descp : Linux下实现串口库
- *************************************************************/
- #include <stdio.h>
- #include <string.h>
- #include "serialport.h"
- int main(int argc,char *argv[])
- {
- int iResult = -1;
- int fd = -1,iCommPort,iBaudRate,iDataSize,iStopBit;
- char cParity;
- int iLen;
- char szBuffer[30];
- iCommPort = 1;
- fd = open_port(iCommPort);
- if( fd<0 )
- {
- perror("open_port error !");
- return 1;
- }
- iBaudRate = 115200;
- iDataSize = 8;
- cParity = 'N';
- iStopBit = 1;
- iResult = set_port(fd,iBaudRate,iDataSize,cParity,iStopBit);
- if( iResult<0 )
- {
- perror("set_port error !");
- return 1;
- }
- printf("fd = %d \n",fd);
- //memset(szBuffer,0,sizeof(szBuffer));
- //iLen = read_port(fd,szBuffer,5);
- iLen = write_port(fd,"Hello",5);
- memset(szBuffer,0,sizeof(szBuffer));
- iLen = read_port(fd,szBuffer,5);
- if( iLen>0 )
- //printf("Write byte success !\n");
- //szBuffer[iLen+1] = '\0';
- printf("iLen = %d ,szBuffer = %s \n",iLen,szBuffer);
- return 0;
- }