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

📄 comport.c

📁 电力行业的DL645采集程序,嵌入式Linux环境
💻 C
字号:

/*********************************************************
版权所有:银骏科技
版本号	:1.00
文件名	:Slave.c
创建日期:07/03
创建者:
功能说明:	串口处理程序文件
*********************************************************/
#define ARM_COMPORT_GLOBALS
#include "cfg_ISlave.h"
struct termios newtio,oldtio;

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)
{
			bzero( &newtio, sizeof( newtio ) );
			cfmakeraw(&newtio);
			tcflush(fd,TCIFLUSH);
			
			
			newtio.c_cflag &= ~CRTSCTS; // no stream ctrl
    	newtio.c_cflag |= CLOCAL | CREAD;   /* | CRTSCTS //stream strl*/
			switch( nBits )
			{
			case 7:
				newtio.c_cflag |= CS7;
				break;
			case 8:
				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;
			}
		
		switch( nSpeed )
			{
				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/ttyS");
    }
    else
    {
      strcpy (cDevName, "/dev/ttyYJ");
      nSn = ttyDevSn-3;
    }
    if (ttyDevSn <= MAXCOMNO) 
    {
      nRet = strlen (cDevName);
      sprintf(&cDevName[nRet],"%d",nSn);
      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 = 0;//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);
    
    if (retval > 0)
    {        
      do
      {       
        do{
          retval = read (fd, &cRecvBuf[nTot++],1);
        }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 + -