【萌新请教】如何设计一个定时器并求这段时间内所有数据的均值?大神小神帮帮忙~

phoebe小七神 2018-04-02 03:31:01
现在需要实现的功能是定时5s采集采集卡中的数据,并求这段时间内所有数据的均值,不过是X\Y两个方向上的数值。。

然后这段程序我就不会写了,求好心的大神给我个思路,或是例程,我好好学习一下,真心是C++小白,对MFC也不是很懂,这个项目的问题卡在这儿,很着急,小女在此先谢过了~~

大致分为以下几步:1、定时器程序段
2、采集到的数据存放在哪里?
3、X、Y分别算均值?

【关于从采集卡采集数据的程序段如下:】
unsigned int Read_PSD(LPVOID pParam)//
{
CTestDlg *dlg = (CTestDlg*) pParam;

int nReadSizeWords; // 每次读取AD数据个数
int nRemainder = 0;
LONG nRetWords; // 实际读取的数据个数
int nChannelCount = 0; // 采样通道数
WORD ADBuffer[32768]; // 接收AD 数据的缓冲区
double Volt; // 将AD原始数据转换为电压值
double px,py;

nChannelCount = dlg->ADPara.LastChannel - dlg->ADPara.FirstChannel + 1; // 采样通道数
nReadSizeWords = 4096;
nRemainder = nReadSizeWords % (nChannelCount*256);
nReadSizeWords = nReadSizeWords - nRemainder; // 读取数据的大小(整个RAM长度64K)

CString str;

while(1)
{
if(!USB5935_ReadDeviceAD(dlg->hDevice, ADBuffer, nReadSizeWords, &nRetWords)) // 读取AD转换数据
{
AfxMessageBox(_T("ReadDeviceAD Error...\n"));
goto ExitReleaseDeviceAD;
}

px=0;
py=0;
unsigned int xx=0;
for (int Index=0; Index<nRetWords-2; Index= Index+2) // 总共显示64个点的AD数据
{
px = px + (ADBuffer[Index]&0x1FFF);
py = py + (ADBuffer[Index+1]&0x1FFF);
xx++;
}
px = px / xx;
py = py / xx;

px = (double)((20000.00/8192) * px - 10000.00); // 将AD数据转换为电压值
py = (double)((20000.00/8192) * py - 10000.00); // 将AD数据转换为电压值

dlg->Draw_Circle(x_0+x_old/100,y_0-y_old/100,0xff);
dlg->Draw_Circle(x_0+px/100,y_0-py/100,0x00);
x_old = px;
y_old = py;

dlg->m_px = px;
dlg->m_py = py;
dlg->UpdateData(false);

if(save_flag)
{
fprintf(pFile,"%.2f\t%.2f\n",px,py);
}

}

ExitReleaseDeviceAD:
USB5935_ReleaseDeviceAD(dlg->hDevice); // 释放AD,停止AD数据转换
return 0;
}


void CTestDlg::Draw_Circle(double x, double y, char show)
{
unsigned long rgb_brush;
if(show)
rgb_brush = RGB(255,255,255);
else
rgb_brush = RGB(255,0,0);

CPen pen(PS_SOLID,4,rgb_brush);

CClientDC dc(this);
dc.SelectObject(&pen);

CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
dc.SelectObject(pBrush);//透明处理

dc.Ellipse(x-1, y-1, x+1, y+1);
}


void CTestDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//if(AD_flag)
//USB5935_ReleaseDeviceAD(hDevice); // 释放AD,停止AD数据转换

//if(Device_flag)
//USB5935_ReleaseDevice(hDevice); //

CDialogEx::OnOK();
...全文
466 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-04-03
  • 打赏
  • 举报
回复
有偿提供帮助:QQ 511606848

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧