📄 comport.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 + -