harold00124 |
2017-01-13 19:47 |
QT写的串口上位机程序
小弟自学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; }
数值有变化都是我控制板子造成的 没有直接在电脑上控制他表示有成功监控... [attachment=16345] 现在还有一难题过不了关 日子难过...
|
|