小弟现在是以传输的资料作XOR当做除错 因为本身传输就有添加检查码在内
但是目前碰的状况是有时后传输的资料速度可能不完整 比方说可能一次5byte 7byte 3byte 或者多到破百byte
现在搞不懂该从何下手
自己手写了几个条件但是就是不知道该如何着手 小弟QT跟C++是同时间入门的 目前刚学1个月还非常的渣
1:如果緩存數大於5 暫停發送請求
2:如果緩存數並非5的基數 等待傳送直到長度正確才做下個動作
因为老板要求检查要频繁 所以我的发送请求用Timer设定为1ms
- runTime->start(1);//定時器時脈 ms
- //定時器連結槽
- connect(runTime,SIGNAL(timeout()),this,SLOT(TimeDeary()));
- void MainWindow::TimeDeary()//定時器
- {
- WidthRead(Dsp[DspPoint]);
- DspPoint+=1;
- if(DspPoint>23)
- {
- DspPoint=0;
- }
- }
- 传送要求後硬体会返回相对应的资料
- void MainWindow::Rxreaddate()//解码將值編號取出並呼叫副程式
- {
- bool ok;
- int Read_Data[4];
- QString Strcode[256];
- Rx=Rxserialport->readAll();
- int Rxlength=Rx.length();
- for(int i=0;i<Rxlength;i++)
- {
- Strcode[i]=Rx.mid(0+i,1).toHex();
- qDebug()<<"Strcode"<<i<<":"<<Strcode[i];
- }
-
-
- int Read_CRC=Strcode[4].toInt(&ok,16);
- qDebug()<<"Read_CRC"<<Read_CRC;
- Read_Data[0]=Strcode[1].toInt(&ok,16)>>4;
- Read_Data[1]=(Strcode[1].toInt(&ok,16)&0xF)|(Strcode[2].toInt(&ok,16)>>7);
- Read_Data[2]=(Strcode[2].toInt(&ok,16)&0x7F)>>3;
- Read_Data[3]=((Strcode[2].toInt(&ok,16)&0x6)<<1)|(Strcode[3].toInt(&ok,16)>>6);
- int tex_CRC=(Strcode[0].toInt(&ok,16)^Strcode[1].toInt(&ok,16)^Strcode[2].toInt(&ok,16)^Strcode[3].toInt(&ok,16))|0x01;
- qDebug()<<"Tex_CRC"<<tex_CRC;
- if(Read_CRC==tex_CRC)//比對CRC 正確才將值解碼
- {
- int Value=(Read_Data[0]<<12)|
- (Read_Data[1]<<8)|
- (Read_Data[2]<<4)|
- (Read_Data[3]);
- qDebug()<<"RX"<<Rx;
- qDebug()<<Value;
- RxDatatoWiget(Value);
- }
- }