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

📄 my_serical.cpp

📁 在QT的环境下实现了gps定位的功能
💻 CPP
字号:
#include  "my_serical.h"bool test=TRUE;bool datecpycon=TRUE;int speed_arr[] = { B115200,B38400, B19200, B9600, B4800, B2400, B1200, B300,                   B38400, B19200, B9600, B4800, B2400, B1200, B300};int name_arr[] = {115200,38400,  19200, 9600,  4800,  2400,  1200,  300, 38400,                   19200,  9600, 4800, 2400, 1200,  300 };int fd=0;static int counter=0;my_serical_impl::my_serical_impl( QWidget* parent,  const char* name, WFlags fl )   :Form1( parent, name, fl ){   info=new gps_info;   info->gps_position=new position;   info->gps_date=new date;   info->gps_time= new time;   QObject::connect ( btn_pause,SIGNAL(clicked()),this,SLOT(status_ch()));    QObject::connect ( bnt_exit,SIGNAL(clicked()),this,SLOT(change_timerstatus()));       QObject::connect ( bnt_exit,SIGNAL(clicked()),qApp,SLOT(quit()));       QObject::connect ( btn_start,SIGNAL(clicked()),this,SLOT(cat_Ser_data()));}my_serical_impl::~my_serical_impl(){}/*********************************************************//******************status_ch()***************************//*******************************************************/void my_serical_impl::status_ch(){   btn_start->setText("Continue");   test=FALSE;   btn_start->setEnabled ( TRUE );   btn_pause->setDisabled(TRUE);}void my_serical_impl::change_timerstatus(){  timer->stop();  this->close();}/**********************************************************//**********************************************************//***********************swrite****************************//********************************************************/ void my_serical_impl::swrite(){     char buff[256],buffdata[80];    int nread ,i=0;  if(datecpycon==TRUE){    if((nread=read(fd,buff,sizeof(buff)))>0)      {        buff[nread] = '\0';        datecpycon=FALSE;        while(buff[i]!='\n')          {             buffdata[i]=buff[i];             i++;          }         buffdata[i]='\0';         SericalShow->insertLine(buffdata);         SericalShow->setCursorPosition(SericalShow->numLines(),0,FALSE);         gps_parse(buffdata);       }      } }/********************************************************//************************gps_date_show******************//******************************************************/void my_serical_impl::gps_date_show(){  QString tmp,year,month,day;  if(info->gps_date->year>0&&info->gps_date->year<=9&&info->gps_date->month>0     &&info->gps_date->month<=12&&info->gps_date->day>0&&info->gps_date->day<=31)  {    year=year.setNum(info->gps_date->year,10);    year="200"+year;    month=month.setNum(info->gps_date->month,10);    day=day.setNum(info->gps_date->day,10);    tmp=year+"."+month+"."+day;    date_edit->clear();    date_edit->insert(tmp);     }}/********************************************************//************************gps_time_show******************//******************************************************/void my_serical_impl::gps_time_show(){  if(info->gps_time->minite>=0&&info->gps_time->minite<=60&&info->gps_time->hour>=0&&info->gps_time->hour<=23&&        info->gps_time->second>=0&&info->gps_time->second<=60){     QString tmp,hour,minite,second;     hour=hour.setNum(info->gps_time->hour,10);     minite=minite.setNum(info->gps_time->minite,10);     second=second.setNum(info->gps_time->second,10);     tmp=hour+":"+minite+":"+second;     time_edit->clear();     time_edit->insert(tmp);   }   else    return;}/********************************************************//*********************gps_sateNo_show*******************//******************************************************/void my_serical_impl::gps_sateNo_show(){   QString tmp;   tmp=tmp.setNum(info->num_sate);   numsate_edit->clear();   numsate_edit->insert(tmp); }/********************************************************//************************gps_position_show***************//******************************************************/void my_serical_impl::gps_position_show(){    QString tmp,change;    if(info->gps_position->longitudtype==TRUE)      tmp="E:";    if(info->gps_position->longitudtype==FALSE)      tmp="W:";    tmp=tmp+change.setNum(info->gps_position->longitude,'f',2);    if(info->gps_position->latitudetype==TRUE)      tmp=tmp+" ,N:";    else       tmp=tmp+" ,T:";    tmp=tmp+change.setNum(info->gps_position->latitude,'f',2);    position_edit->clear();    position_edit->insert(tmp);}/********************************************************//************************gps_info_show******************//******************************************************/void my_serical_impl::gps_info_show(){    gps_date_show();    gps_time_show();    gps_position_show(); }/********************************************************//************************gps_parse**********************//******************************************************/int my_serical_impl::gps_parse(char *info_buff){  char c=info_buff[5],sinal=info_buff[18]; if(c=='C')   {     if(sinal=='V')     {        if(counter==3)         QMessageBox::warning(this,"Warning!"," The signal isn't strong enough");       counter++;     }     if(sinal=='A')        counter=0;      gps_date_parse(info_buff);      gps_time_parse(info_buff);      gps_position_parse(info_buff);      gps_info_show();    } if(c=='V'){    gps_sateNo_parse(info_buff);    gps_sateNo_show();   }   datecpycon=1;	return 0;}/********************************************************//************************gps_date_parse*****************//******************************************************/void  my_serical_impl::gps_date_parse(char *line){   QString lenth;   int len=strlen(line),tmp;   info->gps_date->day=(line[len-13]-'0')*10+(line[len-12]-'0');   tmp=(line[len-11]-'0')*10+(line[len-10]-'0');   if(tmp<=0)     info->gps_date->month=0;   else info->gps_date->month=tmp;   info->gps_date->year=(line[len-9]-'0')*10+(line[len-8]-'0');}/********************************************************//************************gps_time_parse*****************//******************************************************/void  my_serical_impl::gps_time_parse(char*line){   info->gps_time->hour=(line[7]-'0')*10+line[8]-'0'+8;   if(info->gps_time->hour>=24)      info->gps_time->hour=info->gps_time->hour-24;   info->gps_time->minite=(line[9]-'0')*10+line[10]-'0';   info->gps_time->second=(line[11]-'0')*10+line[12]-'0';}/********************************************************//************************gps_position_parse*************//******************************************************/void  my_serical_impl::gps_position_parse(char*line){  char sec_latitude[8],sec_longtitude[8];  float sec_latitu;  float sec_longti;  if(line[20]<='9'&&line[20]>='0')   {       for(int i=0;i<7;i++)       sec_latitude[i]=line[22+i];     sec_latitude[7]='\0';     QString tmp(sec_latitude);     sec_latitu=tmp.toFloat(0);     sec_latitu=sec_latitu/60;     info->gps_position->latitude=(double)((line[20]-'0')*10+(line[21]-'0'))+sec_latitu;   }   if(line[30]=='N')     info->gps_position->latitudetype=TRUE;   else     info->gps_position->latitudetype=FALSE;   if(line[32]<='9'&&line[32]>='0')    {      for(int i=0;i<7;i++)        sec_longtitude[i]=line[35+i];      QString tmp=sec_longtitude;      sec_longti=tmp.toFloat(0);      sec_longti=sec_longti/60;      info->gps_position->longitude=(line[32]-'0')*100+(line[33]-'0')*10+(line[34]-'0')+sec_longti;     }       if(line[43]=='E')      info->gps_position->longitudtype=TRUE;    else      info->gps_position->longitudtype=FALSE;}/********************************************************//*********************gps_sateNo_parse******************//******************************************************/void my_serical_impl::gps_sateNo_parse(char*line){   char c=line[5] ;   if(c=='V')      info->num_sate=line[7]-'0';   else     info->num_sate=0;}/********************************************************//************************set_speed**********************//******************************************************/void my_serical_impl::set_speed(int fd,int speed){        int   i;        int   status;        struct termios   Opt;        tcgetattr(fd, &Opt);        for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {                if  (speed == name_arr[i]) {                        tcflush(fd, TCIOFLUSH);                        cfsetispeed(&Opt, speed_arr[i]);                        cfsetospeed(&Opt, speed_arr[i]);                        status = tcsetattr(fd, TCSANOW, &Opt);                        if  (status != 0) {                                 stat_mul_edit->insertLine("tcsetattr fd1\n");                                return;                        }                        tcflush(fd,TCIOFLUSH);                }        }         stat_mul_edit->insertLine("Baud speed Ok!\n");}/********************************************************//************************set_parity******************//******************************************************/int my_serical_impl::set_parity(int fd,int databits,int stopbits,int parity){          struct termios options;        if  ( tcgetattr( fd,&options)  !=  0) {                stat_mul_edit->insertLine("SetupSerial 0\n");                return(FALSE);        }        options.c_cflag &= ~CSIZE;        switch (databits)        {        case 7:                options.c_cflag |= CS7;                break;        case 8:                options.c_cflag |= CS8;                break;        default:                stat_mul_edit->insertLine("Unsupported data size\n");                return (FALSE);        }switch (parity){        case 'n':        case 'N':                options.c_cflag &= ~PARENB;                options.c_iflag &= ~INPCK;                break;        case 'o':        case 'O':                options.c_cflag |= (PARODD | PARENB);                options.c_iflag |= INPCK;                break;        case 'e':        case 'E':                options.c_cflag |= PARENB;                options.c_cflag &= ~PARODD;                              options.c_iflag |= INPCK;                break;        case 'S':        case 's':                options.c_cflag &= ~PARENB;                options.c_cflag &= ~CSTOPB;                break;        default:                stat_mul_edit->insertLine("Unsupported parity\n");                return (FALSE);        }switch (stopbits){        case 1:                options.c_cflag &= ~CSTOPB;                break;        case 2:                options.c_cflag |= CSTOPB;                break;        default:                 stat_mul_edit->insertLine("Unsupported stop bits\n");                 return (FALSE);}if (parity != 'n')        options.c_iflag |= INPCK;tcflush(fd,TCIFLUSH);options.c_cc[VTIME] = 150;options.c_cc[VMIN] = 0;if (tcsetattr(fd,TCSANOW,&options) != 0)        return (FALSE);stat_mul_edit->insertLine("Set parity  OK!\n");stat_mul_edit->setCursorPosition(SericalShow->numLines(),0,FALSE);return (TRUE);}/********************************************************//************************open_dev***********************//******************************************************/int my_serical_impl::open_dev(char *dev){        int fdtmp =open( dev,O_RDWR);        if (-1 == fdtmp)        {               stat_mul_edit->insertLine("Can't Open Serial Port!\n");		return fdtmp;        }        else         {                stat_mul_edit->insertLine(" Open Serial Port OK!\n");                return fdtmp;                         }}/********************************************************//***********************check_status*******************//******************************************************/void my_serical_impl ::check_status(){    if(test==TRUE)      swrite();    else      return;}/********************************************************//************************cat_Ser_data******************//******************************************************/void my_serical_impl :: cat_Ser_data(){              btn_start->setText("Start");         test=TRUE;        btn_start->setDisabled(TRUE);        btn_pause->setEnabled(TRUE);        char *dev  = "/dev/ttyS0";        fd = open_dev(dev);        set_speed(fd,9600);        if (set_parity(fd,8,1,'N') ==FALSE ){               stat_mul_edit->insertLine("Set Parity Error\n");		close();        }        stat_mul_edit->insertLine("Set serical port0 OK\n");        timer=new QTimer;         QObject::connect( timer, SIGNAL(timeout()),this, SLOT(check_status()));         timer->start(200,FALSE);}

⌨️ 快捷键说明

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