• 5823阅读
  • 1回复

QT写的串口上位机程序 [复制链接]

上一主题 下一主题
离线harold00124
 

只看楼主 倒序阅读 楼主  发表于: 2017-01-13
小弟自学2个月
经过无数苦斗写的上位机程序

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

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


代码都是提供思路而已 不是完整的...
硬体失联后重接可自动接回port口
  1. void MainWindow::TimeDeary()//定時器
  2. {
  3.     int Index=ui->tabWidget->currentIndex();
  4.     //偵測連接Port並自動接上
  5.     //判別旗標 接收到回傳資料後更改旗標跳出該判斷
  6. if(!SerialPort_Link_Flag){
  7.     if(LinkPoint>SerialPort_Name_Point) {
  8.         LinkPoint=0;
  9.         ui->Show_ComPort_label->setText("無可用連結 重新建立連線中");
  10.         ui->Show_Decoding_label->setText("");
  11.         SerialPort_Name_Point=0;
  12.         foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  13.             {
  14.                 //獲得當前可用的所有Port並放入緩存內
  15.                 SerialPort_Name[SerialPort_Name_Point]=info.portName();
  16.                 //每獲得一個Port就讓旗標+1
  17.                 SerialPort_Name_Point++;
  18.             }
  19.     }
  20.     Txserialport->setPortName(SerialPort_Name[LinkPoint]);
  21.     Txserialport->open(QIODevice::ReadWrite);
  22.     WidthRead(DSP_Status);
  23.     SerialPort_Link_Delay->start(1);//計時報錯
  24. }
  25.     //連接成功後執行下列呼叫回應
  26. else{
  27.     if(Index<4){
  28.         if(TX_Begin_Flag==1){
  29.         TX_Begin_Flag = 0;
  30.         WidthRead(Dsp[DspPoint]);
  31.         }
  32.         else ErrTime->start(1);
  33.     }
  34.     if(Index>3 && Index<8){
  35.         if(TX_Begin_Flag==1){
  36.         TX_Begin_Flag = 0;
  37.         WidthRead(Dsp[DspPoint]);
  38.         }
  39.         else ErrTime->start(1);
  40.     }
  41.     if(Index==8){
  42.      if(TX_Begin_Flag==1){
  43.         TX_Begin_Flag = 0;
  44.         WidthRead(Dsp[DspPoint]);
  45.      }
  46.        else ErrTime->start(1);
  47.    }
  48. }
  49. }
  50. void MainWindow::ErrTimeDelay()
  51. {
  52.     if(Txserialport->readAll().isEmpty()){
  53.     ErrPoint+=1;
  54.     }
  55.     if(ErrPoint==20){
  56.         Txserialport->close();
  57.         Txserialport->clear();
  58.         SerialPort_Link_Flag=false;
  59.         ErrPoint=0;
  60.         DspPoint=0;
  61.         ErrTime->stop();
  62.         ui->Show_ComPort_label->setText("請求無回應 重新連線中");
  63.         ui->Show_Decoding_label->setText("");
  64.     }
  65. }
  66. void MainWindow::Port_Link_Delay(){
  67.     if(Txserialport->readAll().isEmpty()){//Port接收緩存為空時 指針+1
  68.     ErrPoint++;
  69.     }
  70.     if(ErrPoint==5){//數值達到10次時
  71.         Txserialport->close();//關閉端口
  72.         Txserialport->clear();//清空緩存
  73.         LinkPoint++;//Port指針++
  74.         ErrPoint=0;//重置報錯指針
  75.         SerialPort_Link_Delay->stop();//停止計時
  76.         ui->Show_ComPort_label->setText("無可用連結 重新建立連線中");
  77.         ui->Show_Decoding_label->setText("");
  78.     }
  79. }


主要来说难题都在逻辑部份...Decode就难住我2周...整个快崩溃了
然后串口接收资料不完整也是让我整个难过了一整周
函式内没定义的都是全局变数
  1. void MainWindow::Rxreaddate()
  2. {
  3.     ErrPoint=0;
  4.     ErrTime->stop();
  5.     SerialPort_Link_Delay->stop();
  6.     TX_Begin_Flag = 1;
  7.     char pai_Rx_CRC,i,pai_CRC_temp=0,Rxlength=0;
  8.     int Read_Data[4]={0};
  9.     int Value;
  10.     Rx=Txserialport->readAll();
  11.     Rxlength=Rx.length();
  12.     char Rx_End_flag = 99;
  13.     for( i=0;i<Rxlength;i++)
  14.     {
  15.         if ( (Rx[i]&0x01) == 1 ) Rx_End_flag = i;
  16.         pai_Rx_Buffer_Array[pai_Rx_Buffer_Byte_Index_No+i] = Rx[i]&0xFE;
  17.     }
  18.     if ( Rx_End_flag != 99 )
  19.     {
  20.       pai_Rx_CRC = Rx[Rx_End_flag]& 0xFE;
  21.       for ( i = 0;i<4;i++)
  22.       pai_Rx_Data_Array[i] = pai_Rx_Buffer_Array[i];
  23.       pai_Rx_Buffer_Byte_Index_No = 0;
  24.       //******************Verify CRC**********************
  25.       for(i=0;i<4;i++)
  26.       pai_CRC_temp=pai_CRC_temp^pai_Rx_Data_Array[i];
  27.       if(pai_CRC_temp==pai_Rx_CRC)
  28.       {
  29.       //******************Decode Data**********************
  30.       Read_Data[0]=(pai_Rx_Data_Array[1]>>4)&0x0F;
  31.       Read_Data[1]=(pai_Rx_Data_Array[1]&0x0E)|((pai_Rx_Data_Array[2]>>7)&0x01);
  32.       Read_Data[2]=(pai_Rx_Data_Array[2]>>3)&0x0F;
  33.       Read_Data[3]=((pai_Rx_Data_Array[2]<<1)&0xE)|((pai_Rx_Data_Array[3]>>6)&0x03);
  34.       Value=(Read_Data[0]<<12)|
  35.             (Read_Data[1]<<8)|
  36.             (Read_Data[2]<<4)|
  37.             (Read_Data[3]);
  38.        ui->Show_Decoding_label->setText("解碼正常");
  39.       if(SerialPort_Link_Flag) Ui_Value_Buffer(Value);
  40.       if(!SerialPort_Link_Flag){
  41.           if(Value==0xAAAA){
  42.               SerialPort_Link_Flag=true;
  43.               ui->Show_ComPort_label->setText(SerialPort_Name[LinkPoint]);
  44.           }
  45.       }
  46.       }
  47.       else
  48.       {
  49.        ui->Show_Decoding_label->setText("解碼出現錯誤");
  50.        DspPoint--;
  51.       }
  52.     }
  53.     else
  54.        pai_Rx_Buffer_Byte_Index_No = i;
  55. }




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



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

离线心竹园长

只看该作者 1楼 发表于: 2017-05-07
你好棒啊~我也在写上位机,不过是网口通信,好难
快速回复
限100 字节
 
上一个 下一个