打印
[数据传输]

基于MFC的上位机数据处理

[复制链接]
3214|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
菜鸟usb|  楼主 | 2015-12-22 22:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的上位机程序中,在数据接收函数中用了一个线程,用这个线程来接受和处理从USB传来的数据,可是下位机数据更新太快,而线程中接受和显示数据需要一定的时间,当一次接受和处理完数据后,再去读取数据时,两次读取的时间中,usb芯片中先传来的数据有一部分会被后传来的数据覆盖,导致数据丢失。我现在想可否用两个线程来处理,一个线程来接受数据,另一个线程来显示数据。如果能,需要怎么做,本人对vc++编程不太熟悉,请高人指点。

相关帖子

沙发
wxjcan| | 2015-12-22 22:53 | 只看该作者
可以参考下生产者消费者方法

使用特权

评论回复
板凳
菜鸟usb|  楼主 | 2015-12-23 16:00 | 只看该作者
wxjcan 发表于 2015-12-22 22:53
可以参考下生产者消费者方法

是在两个线程里操作吗?一个线程负责写数据,一个线程读数据?

使用特权

评论回复
地板
wxjcan| | 2015-12-23 20:26 | 只看该作者
一个写数据,一个或多个多个线程读数据

使用特权

评论回复
5
computer00| | 2015-12-25 20:37 | 只看该作者
几个办法:
1、增加控制协议,等处理完了再让下位机发;
2、把驱动的缓冲区加大,避免数据丢失;
3、使用多线程

使用特权

评论回复
6
McuPlayer| | 2016-1-5 09:08 | 只看该作者
显示在主线程吧,通讯使用专用的线程
别动辄来一个i额字节就刷新,宁可显示迟钝,不可丢后台数据

使用特权

评论回复
7
菜鸟usb|  楼主 | 2016-1-5 10:51 | 只看该作者
computer00 发表于 2015-12-25 20:37
几个办法:
1、增加控制协议,等处理完了再让下位机发;
2、把驱动的缓冲区加大,避免数据丢失;

1、下位机的数据是高速更新的,增加控制协议,会使得下位机数据丢失很严重。
2、驱动我是用的官方提供的,不会修改呀。
还想请教您几个问题,我用的是bulk传输,从FIFO,设置为4缓冲(4*512),同步传输,上位机在一个for循环里不断的接收数据,接收函数就是XferData了吧,那想问一下,1、timeout参数我该怎么设置。2、接收缓冲区indata[],应该设置为多大呀,很多参考程序上都是给的512,就是每次调用XferData()函数,读取512字节数据。我可以设置的更大一些么?

使用特权

评论回复
8
菜鸟usb|  楼主 | 2016-1-5 10:54 | 只看该作者
McuPlayer 发表于 2016-1-5 09:08
显示在主线程吧,通讯使用专用的线程
别动辄来一个i额字节就刷新,宁可显示迟钝,不可丢后台数据 ...

恩,现在就是显示和接收在一个线程里,显示的数据根本看不清,一直在刷屏。我们需要实时显示,应该怎么控制呀,既不想刷屏又想实时显示,感觉有矛盾呀。

使用特权

评论回复
9
菜鸟usb|  楼主 | 2016-1-5 10:56 | 只看该作者
wxjcan 发表于 2015-12-23 20:26
一个写数据,一个或多个多个线程读数据

那(共享)数据缓冲区应该设置多大,是不是设置一个队列,一个线程写,一个线程读取并显示

使用特权

评论回复
10
菜鸟usb|  楼主 | 2016-1-5 14:41 | 只看该作者
computer00 发表于 2015-12-25 20:37
几个办法:
1、增加控制协议,等处理完了再让下位机发;
2、把驱动的缓冲区加大,避免数据丢失;
/**********************************************************

                    线程函数

bulk传输模式,从FIFO,同步传输。usb FIFO设置为4*512缓冲.想实现连续传输,并显示



***********************************************************/
UINT XferLoop( LPVOID params )
{       
       
        CSJCJVCDlg *dlg = (CSJCJVCDlg *) params;
        dlg->InEndpt=dlg->USBDevice->BulkInEndPt;
        bool           success;
        PUCHAR inData = new UCHAR[512];//接收数据缓冲区
        ZeroMemory(inData,512);
        dlg->InEndpt->TimeOut=2000;//1、传输等待时间?这个从参数是根据什么设置的
        for(;dlg->blooping;)
        {
                LONG length=512;//2、定义数据长度,可以设置成1024或者2048,也就是调用一次XferData读取到2个包数据
                success=dlg->InEndpt->XferData(inData,length);
                if(success)//读取成功将数据写入文件
                {
                        mFile.SeekToEnd();
                        mFile.Write(inData,length);
                }
                if(!success)
                {
                dlg->blooping=false;
                }
               
        }   
        delete [] inData;//释放对象
        dlg->ReadThread = NULL;
        dlg->USBDevice->Close();
        mFile.Flush();
        mFile.Close();
        return true;

}

使用特权

评论回复
11
nethopper| | 2016-1-7 12:31 | 只看该作者
要完全连续不间断传输,等同于数据流传输了。上位机的接收缓冲可以开很大,最好是下位机缓冲区大小的整数倍,但并不受限制于下位机的缓冲区大小。

至于处理数据和显示数据,不一定能实现一个点不漏地显示数据,要看处理数据和显示数据所需要的时间和电脑自身的速度了。所谓实时显示,不一定要求每个点都不漏地显示,只要人眼看不出太大的滞后就行。保存数据一个点不漏是有可能实现的。每个线程可指定优先权。重要的线程优先。

使用特权

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

本版积分规则

4

主题

13

帖子

0

粉丝