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

📄 serial.cpp

📁 嵌入式pxa 270平台上的GPS和GSM通信实验
💻 CPP
字号:
#include "serial.h"static struct termios termios_old, termios_new;  //static fd_set   fs_write;//static struct timeval tv_timeout;Serial::Serial(){}Serial::~Serial(){}int Serial::_BaudRate(int baudrate){    switch(baudrate)    {    case B2400:	return (2400);	    case B4800:	return (4800);    case B9600:	return (9600);    case B19200:	return (19200);    case B38400:	return (38400);    case B57600:	return (57600);    case B115200:	return (115200);    default:	return (9600);    }    }int Serial::BaudRate( int baudrate){    switch(baudrate)    {    case 0:	return (B2400);    case 1:	return (B4800);    case 2:	return (B9600);    case 3:	return (B19200);    case 4:	return (B38400);    case 5:	return (B57600);    case 6:	return (B115200);    default:	return (B9600);    }}int Serial::setPara(int serialfd,int speed,int databits , int stopbits ,int parity ){    bzero( &termios_new, sizeof(termios_new));    cfmakeraw(&termios_new);    termios_new.c_cflag=BaudRate(speed);    termios_new.c_cflag |= CLOCAL | CREAD;        termios_new.c_cflag &= ~CSIZE;    switch (databits) //设置数据位    {    case 0:	termios_new.c_cflag |= CS8;	break;    case 1:	termios_new.c_cflag |= CS7;	break;		    case 2:	termios_new.c_cflag |= CS6;	break;    case 3:	termios_new.c_cflag |= CS5;	break;		    default:	termios_new.c_cflag |= CS8;	break;	    }	    switch (parity) //设置奇偶位	        {    case 0:  				//as no parity	termios_new.c_cflag &= ~PARENB;    //Clear parity enable 	break;	    case 1:		termios_new.c_cflag |= PARENB;     // Enable parity 	termios_new.c_cflag &= ~PARODD;   	break;    case 2:		termios_new.c_cflag |= PARENB;  	termios_new.c_cflag |= ~PARODD;	break;	    default:	termios_new.c_cflag &= ~PARENB;   // Clear parity enable 	break;	    		    }    switch (stopbits)// set Stop Bit    {    case 0:	termios_new.c_cflag &= ~CSTOPB;	break;    case 1:	termios_new.c_cflag |= CSTOPB;	break;    default:	termios_new.c_cflag &= ~CSTOPB;	break;		    }    tcflush(serialfd,TCIFLUSH); // Update the termios_new and do it NOW     termios_new.c_cc[VTIME] = 1; /* unit: 1/10 second. */    termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */    tcflush (serialfd, TCIFLUSH);    return tcsetattr(serialfd,TCSANOW,&termios_new);} int Serial::nwrite (int serialfd, const char *data, int datalength ){    //int retval,     int len = 0, total_len = 0;//modify8.8    //FD_ZERO (&fs_write);    //FD_SET (serialfd, &fs_write);    //tv_timeout.tv_sec = TIMEOUT_SEC( datalength,GetBaudRate());    //tv_timeout.tv_usec = TIMEOUT_USEC;    for (total_len = 0 ; total_len < datalength;)     {	len = 0;        //retval = select (serialfd + 1, NULL, &fs_write, NULL, &tv_timeout);        //if (retval) 	//{	    len = ::write(serialfd, &data[total_len], datalength - total_len);            if (len > 0)                 total_len += len;                  //}       // else 	//{   //         tcflush (serialfd, TCOFLUSH);     /* flush all output data */     //       break;       // }    }    return (total_len);}int Serial::GetBaudRate(){    return (_BaudRate(cfgetospeed(&termios_new)));}void Serial::closePort(int serialfd){    tcsetattr (serialfd, TCSADRAIN, &termios_old);    ::close (serialfd);}int  Serial::openPort(int index){    char *device;    switch(index)    {    case 0:	device="/dev/ttyS0";	break;	    case 1:	device="/dev/ttyS1";	break;    case 2:	device="/dev/ttyS2";	break;    case 3:	device="/dev/ttyS3";	break;    default:	device="/dev/ttyS0";    }			    int fd=open( device, O_RDWR | O_NOCTTY | O_NONBLOCK);    if ( fd<0)    { 	//QMessageBox::information(this,"Information","Can't Open the Serial Port");	return -1;    }    tcgetattr(fd , &termios_old);    	return fd;    }

⌨️ 快捷键说明

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