打印

关于数据处理的问题

[复制链接]
1898|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kusheng176|  楼主 | 2010-9-14 12:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在在MFC上接收到单片机发送过来的数据,8个数据为一组。当发过来N组数据的时候,我首先要对每一组数据进行处理,就是将每一组的8个数据进行相加,看是否=0x00(0x00为等待信号;非0x00为所需数据)
若不等于,先暂时放在一边(这些数据是需要还原的,但是这个操作是最后进行的),再判断下一组数据。直到所有数据判断完以后,再进行还原。下面是我的程序(我用的是Scomm控件,RThreshold=1)

VARIANT variant_inp;  
COleSafeArray safearray_inp ;
LONG len,k;
BYTE rxdata [2048] ; //设置BYTE 数组An 8bit integerthat is not signed.
CString buffer,buffifo ;
if (m_ctrlScom. GetCommEvent()==2)// 事件值为2 表示接收缓冲区内有字符
{ ///// 以下可以根据自己的通信协议加入处理代码
  variant_inp = m_ctrlScom. GetInput () ; // 读缓冲区
safearray_inp = variant_inp ; // VARIANT型变量转换为ColeSafeArray 型变量
len = safearray_inp. GetOneDimSize () ; // 得到有效数据长度
for(k=0;k<len;k++)
safearray_inp. GetElement ( &k,rxdata+k) ; // 转换为BYTE 型数组
for (k=0;k<len;k++) // 将数组转换为CString 型变量
{
  BYTE bt=*(char * ) (rxdata+k) ;
buffer.Format("%02x",bt); //将字符送入临时变量buffer存放
m_output+=buffer; //在编辑框中显示所有数据
m_edit123+=bt ; //加入接收编辑框对应字符串
m_zijie+=1; //总共数据数
pdateData(FALSE);
  if (bt!=0x00)
  {
huanyuan();
  }   
}
}


我现在的问题就是:数据(全部)进来后,我要如何只对每8个数据进行处理,而不是全部。

相关帖子

沙发
acgean| | 2010-9-14 12:31 | 只看该作者
其实, MFC 对于数据处理的能力是比较弱的.
对于楼主的问题. 我觉得需要如下改进
1. 协议问题.
  每组8个是不错, 如果数据连续发送, 怎么来进行组与组的区分. 所以是否考虑进行数据包的头, 间隔. 冗余和校验等等, 让接收端在完全接收到数据的情况下, 能区分各个数据包.
2. MFC 的改进.
  MFC 只是告诉你缓冲是否有数据接收到, 却没有其他可用信息. 不过, 我之前倒是改造过, 利用收到数据的时间来分别数据包和帧间隔, 是收到效果的.  但是要选择精度高的定时器, 因为普通的定时器的精度很差.
另外, 由于 windows 的多任务性, 这个还不能完全解决问题. 所以通信协议里增加冗余数据来进行数据包识别的技术是一定要采用的.

使用特权

评论回复
板凳
McuPlayer| | 2010-9-14 12:45 | 只看该作者
这也能跟MFC拉上关系

使用特权

评论回复
地板
kusheng176|  楼主 | 2010-9-14 15:51 | 只看该作者
2# acgean

使用特权

评论回复
5
kusheng176|  楼主 | 2010-9-14 15:51 | 只看该作者
2# acgean

我在MFC中做了一个32*32的格子,到时候做数据还原的时候,结果要在这个格子里显示出来的。
如果中间考虑那些东西的话,我到时候还原数据的时候会比较麻烦。

使用特权

评论回复
6
highgear| | 2010-9-14 22:27 | 只看该作者
既然用了 mfc, 最好是用一个封装 comm api 的类, 而不是使用 activeX mscomm, 虽然开始麻烦些, 但一劳永逸, 更强大灵活。

“只对每8个数据进行处理“, 最好在单片机做一个简单的协议。 如果不想做协议, mscomm 里可以设置 InputLen 为8 并且检查 InBufferCount。 或者全部读出, 放入一个大的circular buffer 中, 然后处理数据。

使用特权

评论回复
7
SLEET1986| | 2010-9-15 08:09 | 只看该作者
标记一下。。。

使用特权

评论回复
8
kusheng176|  楼主 | 2010-9-15 10:07 | 只看该作者
6# highgear

其实我设置过RThreshold=8,也就是每接收8个数据作一次处理,效果还可以。但是有一个问题:我最后确认的时候,也就是整个数据的结尾,我发送的只是一个0xff,这样根本就不会触发Oncomm事件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

64

帖子

1

粉丝