查看完整版本: [-- QT写的串口上位机程序 --]

QTCN开发网 -> Qt基础编程 -> QT写的串口上位机程序 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

harold00124 2017-01-13 19:47

QT写的串口上位机程序

小弟自学2个月
经过无数苦斗写的上位机程序

功能有
控制修改与监控PLC面板内的值

程序开启后自动发送确认码并测试所有可用Port口直到PLC相应的port口回传确认值后才做对接


代码都是提供思路而已 不是完整的...
硬体失联后重接可自动接回port口
  1. 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周...整个快崩溃了
然后串口接收资料不完整也是让我整个难过了一整周
函式内没定义的都是全局变数
  1. 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;
    }




数值有变化都是我控制板子造成的 没有直接在电脑上控制他表示有成功监控...
[attachment=16345]


现在还有一难题过不了关 日子难过...


心竹园长 2017-05-07 21:48
你好棒啊~我也在写上位机,不过是网口通信,好难


查看完整版本: [-- QT写的串口上位机程序 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled