现在需要实现的功能是定时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();