QT写的串口上位机程序

weixin_38052602 2019-09-19 06:35:26
小弟自学2个月经过无数苦斗写的上位机程序 功能有控制修改与监控PLC面板内的值 程序开启后自动发送确认码并测试所有可用Port口直到PLC相应的port口回传确认值后才做对接 代码都是提供思路而已 不是完整的...硬体失联后重接可自动接回port口 复制代码void MainWindow::TimeDeary()//定時器{    int Index=ui->tabWidget->currentIndex();    //偵測連接Port並自動接上    //判別旗標 接收到回傳資料後更改旗標跳出該判斷if(!SerialPort_Link_Flag){    if(LinkPoint>SerialPort_Name_Point) {        LinkPoint=0;        ui->Show_ComPort_label->setText("無可用連結 重新建立連線中");        ui->Show_Decoding_label->setText("");        SerialPort_Name_Point=0;        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())            {                //獲得當前可用的所有Port並放入緩存內                SerialPort_Name[SerialPort_Name_Point]=info.portName();                //每獲得一個Port就讓旗標+1                SerialPort_Name_Point++;            }    }    Txserialport->setPortName(SerialPort_Name[LinkPoint]);    Txserialport->open(QIODevice::ReadWrite);    WidthRead(DSP_Status);    SerialPort_Link_Delay->start(1);//計時報錯}    //連接成功後執行下列呼叫回應else{    if(Index<4){        if(TX_Begin_Flag==1){        TX_Begin_Flag = 0;        WidthRead(Dsp[DspPoint]);        }        else ErrTime->start(1);    }    if(Index>3 && Index<8){        if(TX_Begin_Flag==1){        TX_Begin_Flag = 0;        WidthRead(Dsp[DspPoint]);        }        else ErrTime->start(1);    }    if(Index==8){     if(TX_Begin_Flag==1){        TX_Begin_Flag = 0;        WidthRead(Dsp[DspPoint]);     }       else ErrTime->start(1);   }}}void MainWindow::ErrTimeDelay(){    if(Txserialport->readAll().isEmpty()){    ErrPoint+=1;    }    if(ErrPoint==20){        Txserialport->close();        Txserialport->clear();        SerialPort_Link_Flag=false;        ErrPoint=0;        DspPoint=0;        ErrTime->stop();        ui->Show_ComPort_label->setText("請求無回應 重新連線中");        ui->Show_Decoding_label->setText("");    }}void MainWindow::Port_Link_Delay(){    if(Txserialport->readAll().isEmpty()){//Port接收緩存為空時 指針+1    ErrPoint++;    }    if(ErrPoint==5){//數值達到10次時        Txserialport->close();//關閉端口        Txserialport->clear();//清空緩存        LinkPoint++;//Port指針++        ErrPoint=0;//重置報錯指針        SerialPort_Link_Delay->stop();//停止計時        ui->Show_ComPort_label->setText("無可用連結 重新建立連線中");        ui->Show_Decoding_label->setText("");    }}主要来说难题都在逻辑部份...Decode就难住我2周...整个快崩溃了然后串口接收资料不完整也是让我整个难过了一整周函式内没定义的都是全局变数复制代码void MainWindow::Rxreaddate(){    ErrPoint=0;    ErrTime->stop();    SerialPort_Link_Delay->stop();    TX_Begin_Flag = 1;    char pai_Rx_CRC,i,pai_CRC_temp=0,Rxlength=0;    int Read_Data[4]={0};    int Value;    Rx=Txserialport->readAll();    Rxlength=Rx.length();    char Rx_End_flag = 99;    for( i=0;i<Rxlength;i++)    {        if ( (Rx[i]&0x01) == 1 ) Rx_End_flag = i;        pai_Rx_Buffer_Array[pai_Rx_Buffer_Byte_Index_No+i] = Rx[i]&0xFE;    }    if ( Rx_End_flag != 99 )    {      pai_Rx_CRC = Rx[Rx_End_flag]& 0xFE;      for ( i = 0;i<4;i++)      pai_Rx_Data_Array[i] = pai_Rx_Buffer_Array[i];      pai_Rx_Buffer_Byte_Index_No = 0;      //******************Verify CRC**********************      for(i=0;i<4;i++)      pai_CRC_temp=pai_CRC_temp^pai_Rx_Data_Array[i];      if(pai_CRC_temp==pai_Rx_CRC)      {      //******************Decode Data**********************      Read_Data[0]=(pai_Rx_Data_Array[1]>>4)&0x0F;      Read_Data[1]=(pai_Rx_Data_Array[1]&0x0E)|((pai_Rx_Data_Array[2]>>7)&0x01);      Read_Data[2]=(pai_Rx_Data_Array[2]>>3)&0x0F;      Read_Data[3]=((pai_Rx_Data_Array[2]<<1)&0xE)|((pai_Rx_Data_Array[3]>>6)&0x03);      Value=(Read_Data[0]<<12)|            (Read_Data[1]<<8)|            (Read_Data[2]<<4)|            (Read_Data[3]);       ui->Show_Decoding_label->setText("解碼正常");      if(SerialPort_Link_Flag) Ui_Value_Buffer(Value);      if(!SerialPort_Link_Flag){          if(Value==0xAAAA){              SerialPort_Link_Flag=true;              ui->Show_ComPort_label->setText(SerialPort_Name[LinkPoint]);          }      }      }      else      {       ui->Show_Decoding_label->setText("解碼出現錯誤");       DspPoint--;      }    }    else       pai_Rx_Buffer_Byte_Index_No = i;} 数值有变化都是我控制板子造成的 没有直接在电脑上控制他表示有成功监控... 现在还有一难题过不了关 日子难过...
...全文
19 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧