Linux下实现应用层串口库函数
2012-06-13 22:48
501 查看
//serialport.h
//serialport.c
//demo.c
/************************************************************* 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; }
相关文章推荐
- Linux下实现应用层串口库函数
- linux应用编程笔记(6)库函数方式实现文件复制编程
- linux 应用层串口调试函数
- 解读linux对string.h函数的实现
- 作业 4 函数应用 4、输入x、n后输出下列算式的值,fact(n)实现n!,mypow(x,n)实现xn
- linux下c程序调用reboot函数实现直接重启
- linux 调用系统函数来实现 ATM 自动取款机功能 (进程间通信)
- linux中list.h中函数应用实例
- linux平台下应用SSH实现相互访问
- 浅析 Linux 中的时间编程和实现原理,第 1 部分: Linux 应用层的时间编程
- pvtrace和Graphviz实现对linux下C程序的函数调用跟踪
- 对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?
- Linux下串口编程之一:基础设置函数
- LINUX下(虚拟机中的LINUX系统)串口通讯 part3------fedora 9下USB转串口的应用和minicom的设置(转载)
- 串口编程 —— 实现 GPS 过程中自己用到的函数 COMMTIMEOUTS,SetCommMask,SetCommTimeouts
- Linux调度域负载均衡-设计,实现和应用
- linux下signal与alarm函数实现定时器刷新
- 如何实现在Oracle中应用存储过程调用MatLab函数(1)
- 【Linux】实现睡眠函数mysleep
- 嵌入式成长轨迹24【Linux应用编程强化】【Linux下的C编程 下】【实例:Linux命令实现】