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