• 3819阅读
  • 4回复

[提问]QserialPort接收的问题 [复制链接]

上一主题 下一主题
离线harold00124
 

只看楼主 倒序阅读 楼主  发表于: 2016-12-01
小弟现在用RS232与硬体沟通
硬体会发送一笔5Byte长度的资料
目前因为硬体部份工程师还没做完没办法实测
所以我现在也还不知道硬体发送的状况是如何

而且依照小弟之前练习的经验 有时后插座插拔时模拟器的程式有时会接到一些脉冲乱码

问题1:小弟要如何确保5个Byte接收完毕才让程式执行编译
问题2:接收到的资料要如何分割成1个byte分别放入阵列内?
问题3:要如何确保脉冲乱码不会导致我接收资料的长度出现错误
比方说程式接收到
1byte脉冲乱码 5byte资料(1) 5byte资料(2) 5byte资料(3) 5byte资料(4)

程式编译到 脉冲乱码+4Bbyte资料(1)  1byte资料(1)+4byte资料(2)............




导致整个程式由前到后读取的资料都变的不正确


在线uidab

只看该作者 1楼 发表于: 2016-12-01
修改协议,增加起始和结束字节判断。
比如约定AAAAAA,三个字节起始。ZZZZZZ三个字节结束。
1条评分金钱+10
harold00124 金钱 +10 感谢回应 2016-12-01
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线harold00124

只看该作者 2楼 发表于: 2016-12-01
谢谢版大的回应 请教一下有没有相关的范例能够查找呢? 因为小弟刚学 脑袋中会用的代码还不多
在线uidab

只看该作者 3楼 发表于: 2016-12-01
回 harold00124 的帖子
harold00124:谢谢版大的回应 请教一下有没有相关的范例能够查找呢? 因为小弟刚学 脑袋中会用的代码还不多 (2016-12-01 11:29) 

以前写的都是MFC的,估计找起来也不容易了。你可以搜一下,网上这方面还是挺多的。
1条评分金钱+10
harold00124 金钱 +10 謝謝大大 我再找找 2016-12-01
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线harold00124

只看该作者 4楼 发表于: 2016-12-02
小弟现在是以传输的资料作XOR当做除错 因为本身传输就有添加检查码在内
但是目前碰的状况是有时后传输的资料速度可能不完整 比方说可能一次5byte 7byte 3byte 或者多到破百byte
现在搞不懂该从何下手
自己手写了几个条件但是就是不知道该如何着手 小弟QT跟C++是同时间入门的 目前刚学1个月还非常的渣

1:如果緩存數大於5 暫停發送請求
2:如果緩存數並非5的基數 等待傳送直到長度正確才做下個動作

因为老板要求检查要频繁 所以我的发送请求用Timer设定为1ms
  1. runTime->start(1);//定時器時脈 ms
  2.     //定時器連結槽
  3.     connect(runTime,SIGNAL(timeout()),this,SLOT(TimeDeary()));
  1. void MainWindow::TimeDeary()//定時器
  2. {
  3.        WidthRead(Dsp[DspPoint]);
  4.        DspPoint+=1;
  5.        if(DspPoint>23)
  6.        {
  7.            DspPoint=0;
  8.        }
  9. }
  10. 传送要求後硬体会返回相对应的资料

  1. void MainWindow::Rxreaddate()//解码將值編號取出並呼叫副程式
  2. {
  3.     bool ok;
  4.     int Read_Data[4];
  5.     QString Strcode[256];
  6.     Rx=Rxserialport->readAll();
  7.     int Rxlength=Rx.length();
  8.     for(int i=0;i<Rxlength;i++)
  9.     {
  10.         Strcode[i]=Rx.mid(0+i,1).toHex();
  11.         qDebug()<<"Strcode"<<i<<":"<<Strcode[i];
  12.     }
  13.     
  14.     
  15.     int Read_CRC=Strcode[4].toInt(&ok,16);
  16.     qDebug()<<"Read_CRC"<<Read_CRC;
  17.     Read_Data[0]=Strcode[1].toInt(&ok,16)>>4;
  18.     Read_Data[1]=(Strcode[1].toInt(&ok,16)&0xF)|(Strcode[2].toInt(&ok,16)>>7);
  19.     Read_Data[2]=(Strcode[2].toInt(&ok,16)&0x7F)>>3;
  20.     Read_Data[3]=((Strcode[2].toInt(&ok,16)&0x6)<<1)|(Strcode[3].toInt(&ok,16)>>6);
  21.     int tex_CRC=(Strcode[0].toInt(&ok,16)^Strcode[1].toInt(&ok,16)^Strcode[2].toInt(&ok,16)^Strcode[3].toInt(&ok,16))|0x01;
  22.     qDebug()<<"Tex_CRC"<<tex_CRC;
  23.     if(Read_CRC==tex_CRC)//比對CRC 正確才將值解碼
  24.     {
  25.     int Value=(Read_Data[0]<<12)|
  26.               (Read_Data[1]<<8)|
  27.               (Read_Data[2]<<4)|
  28.               (Read_Data[3]);
  29.     qDebug()<<"RX"<<Rx;
  30.     qDebug()<<Value;
  31.     RxDatatoWiget(Value);
  32.     }
  33. }



快速回复
限100 字节
 
上一个 下一个