⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comport.c

📁 linux 多串口测试程序
💻 C
字号:
/*********************************************************版权所有:银骏科技版本号	:1.00文件名	:Slave.c创建日期:07/03创建者:功能说明:	串口处理程序文件*********************************************************/#define ARM_COMPORT_GLOBALS#include "cfg_com.h"struct termios oldtio, newtio;int GetComDevName (INT8U ttyDevSn, char *cDevName,int nMaxLen);/*****************************************************************************************函数名称:     int SetComOpt(int fd,int nSpeed,int nBits,char nEvent,int nStop)功能说明:     设置串口的参数  输入参数:      输出参数:      其它说明:      nSpeed 波特率,nBits数据位,nEvent校验位('N'(无校验),'O'(奇校验),'E'(偶校验),nStop 1-2停止位******************************************************************************************/int SetComOpt(int fd,int nSpeed,int nBits,char nEvent,int nStop){	//		struct termios newtio;			bzero( &newtio, sizeof( newtio ) );			cfmakeraw(&newtio);			tcflush(fd,TCIFLUSH);									newtio.c_cflag &= ~CRTSCTS; // no stream ctrl    	   newtio.c_cflag |= CLOCAL | CREAD;   /* | CRTSCTS //stream strl*/    	   newtio.c_cflag &= ~CSIZE;			switch( nBits )			{		    case 7:		        newtio.c_cflag |= CS7;		        break;		    case 6:		        newtio.c_cflag |= CS6;		        break;		    case 5:		        newtio.c_cflag |= CS5;		        break;		    default:		        newtio.c_cflag |= CS8;		        break; 			}					switch( nEvent )			{				case 'o':				case 'O':					newtio.c_cflag |= PARENB;					newtio.c_cflag |= PARODD;				//	newtio.c_iflag |= (INPCK | ISTRIP);					break;				case 'e'	:				case 'E': 					//newtio.c_iflag |= (INPCK | ISTRIP);					newtio.c_cflag |= PARENB;					newtio.c_cflag &= ~PARODD;					break;				case 'n':				case 'N':					newtio.c_cflag &= ~PARENB;					break;				default:					newtio.c_cflag |= PARENB;					newtio.c_cflag &= ~PARODD;					break;			}				switch( nSpeed )			{				case 300:					cfsetispeed(&newtio, B300);					cfsetospeed(&newtio, B300);					break;								case 600:					cfsetispeed(&newtio, B600);					cfsetospeed(&newtio, B600);					break;								case 1200:					cfsetispeed(&newtio, B1200);					cfsetospeed(&newtio, B1200);					break;								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 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 )				newtio.c_cflag &=  ~CSTOPB;			else if ( nStop == 2 )			newtio.c_cflag |=  CSTOPB;			newtio.c_cc[VTIME]  = 1;			newtio.c_cc[VMIN] = 1;								newtio.c_oflag = 0;    	newtio.c_lflag |= 0;    	newtio.c_oflag &= ~OPOST;    	newtio.c_cc[VTIME] = 1;     /* unit: 1/10 second. */       newtio.c_cc[VMIN] = 1;      /* minimal characters for reading */						if((tcsetattr(fd,TCSANOW,&newtio))!=0)			{				perror("com set error");				return -1;			}			//printf("set done!\n");			return 0;				    }/*****************************************************************************************函数名称:     int  OpenCom(INT8U comPort)功能说明:     打开指定串口返回一个句柄输入参数:      输出参数:      其它说明:     comport是从0开始的******************************************************************************************/int  OpenCom(INT8U comPort){		 char cComPort[20] = { 0 };		 int fd;		 		 if (SUCCESS == GetComDevName (comPort, (char *) cComPort,20)) 		 {                       fd =  open (cComPort, O_RDWR | O_NOCTTY | O_NONBLOCK);            if(fd > 0)            {            	tcgetattr(fd,&oldtio);            }            		 }      else      {      		perror("Can't open Serial port");      					    return -1;          }//  //	   if(fcntl(fd, F_SETFL, 0)<0)//			printf("fcntl failed!\n");//		else//			printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));//		if(isatty(STDIN_FILENO)==0)//			printf("standard input is not a terminal device\n");//		else//			printf("isatty success!\n");//		printf("fd-open=%d\n",fd);			return fd;}/*****************************************************************************************函数名称: int GetComDevName (INT8U ttyDevSn, char *cDevName,int nMaxLen)功能说明:获取串口的驱动名称 0-2为ttyS 三星公司自带的 3-n 为扩展串口驱动名称为ttyYJ输入参数:      输出参数:      其它说明:  ******************************************************************************************/int GetComDevName (INT8U ttyDevSn, char *cDevName,int nMaxLen){    int nRet = -1,nSn;        if(nMaxLen < 15) return -1;        memset(cDevName,0,nMaxLen);        if(ttyDevSn < 3)    {      nSn = ttyDevSn;      strcpy (cDevName, "/dev/ttySAC/");    }    else    {      strcpy (cDevName, "/dev/ttyS");      nSn = ttyDevSn-3;    }    if (ttyDevSn <= MAXCOMNO)     {      nRet = strlen (cDevName);      sprintf(&cDevName[nRet],"%d",nSn);      printf("open dev is %s\n",cDevName);      nRet = SUCCESS;    }    return nRet;}/*****************************************************************************************函数名称: int ComSend (int fd,const INT8U * cSendBuf, INT32U nSendLen, INT32U nWaitmScnd)功能说明:串口发送数据 返回实际发送的字节数输入参数:      输出参数:      其它说明:  fd 为打开时的句柄  nWaitmScnd 为等待的时间毫秒级******************************************************************************************/int ComSend (int fd,const INT8U * cSendBuf, INT32U nSendLen, INT32U nWaitmScnd){	  struct timeval tv_timeout;    int nCurLen, len ;    INT32U dwSent ;    fd_set fs_write;          len = 0;     dwSent = 0;    FD_ZERO (&fs_write);    FD_SET (fd, &fs_write);    tv_timeout.tv_sec = 0;     //TIMEOUT_SEC (nSendLen, GetBaudrate (&oldtio));    tv_timeout.tv_usec = nWaitmScnd*1000;//TIMEOUT_USEC;    while (dwSent < nSendLen)     {        nCurLen = select (fd + 1, NULL, &fs_write, NULL, &tv_timeout);        if (nCurLen > 0)        {            nCurLen = nSendLen - dwSent - 10;            if (nCurLen > 0)                nCurLen = 10;            else                nCurLen = nSendLen - dwSent;            len = write (fd, &cSendBuf[dwSent], nCurLen);            if (len > 0) {                dwSent += len;            }        }        else        {            tcflush (fd, TCOFLUSH);    /* flush all output data */            break;        }        usleep(1);    }    return dwSent;}/*****************************************************************************************函数名称:int ComRecv (int fd,INT8U * cRecvBuf, INT32U  nReqBytes, INT32U nWaitmScnd)功能说明:串口接收数据 返回实际接收的字节数输入参数:      输出参数:      其它说明:  fd 为打开时的句柄  nWaitmScnd 为等待的时间毫秒级******************************************************************************************/int ComRecv (int fd,INT8U * cRecvBuf, INT32U  nReqBytes, INT32U nWaitmScnd){    int retval ;    static fd_set  fs_read;    struct timeval tv_timeout;    int nTot=0,nTry=0; //   int nread;		retval = FAILED;    FD_ZERO (&fs_read);    FD_SET (fd, &fs_read);    tv_timeout.tv_sec = 10;//TIMEOUT_SEC (nReqBytes, GetBaudrate ());    tv_timeout.tv_usec = nWaitmScnd*1000;//TIMEOUT_USEC;            nReqBytes = (nReqBytes == 0 ? retval : nReqBytes);    retval = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);    printf("retval select is %d\n",retval);    if (retval > 0)    {              do      {               do{          	if(FD_ISSET(fd,&fs_read))          	{          		retval = read (fd, &cRecvBuf[nTot++],1);          		if(retval> 0)          		{          			printf("ComRecv retval is %d\n",cRecvBuf[nTot]);          		}          	}        }while( (retval>0) && (nTot < nReqBytes) );        if(retval < 0) nTot--;// failed,move  point back         if( ((retval>0)&&(nTot==nReqBytes)) || (nTry > 150) )        {                    retval = nTot;          break;        }        else         {          usleep(1);          nTry++;                  }      }while(1);          }         return retval;}/*****************************************************************************************函数名称: int CloseCom (int fd)功能说明:关闭串口输入参数:      输出参数:      其它说明:  fd 为打开时的句柄  ******************************************************************************************/int CloseCom (int fd){//	 tcsetattr (fd, TCSANOW, &oldtio);  // restore old   tcflush (fd, TCOFLUSH);   return close (fd);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -