数据采用16位存储,默认低四位为0,即高12位有效。例如,某采集通道转换数据为6FF,实际存储数据为6FF0。
因为现在数据是测试的随机数,所以不能从画出的图上看结果是否正确。我现在打开了文件
HANDLE hFile=::CreateFile(FileDlg.GetPathName(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ASSERT(hFile!=NULL);
HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
ASSERT(hMap!=NULL);
WORD* lpvFile=(WORD *)::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);然后针对每一个WORD数据,我按下面方法读
m_Signal_CM1[i]=(float)(short)( ( lpvFile[8 * i ] >> 4 ) & 0xffff );
因为现在数据是测试的随机数,所以不能从画出的图上看结果是否正确。我现在打开了文件
HANDLE hFile=::CreateFile(FileDlg.GetPathName(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ASSERT(hFile!=NULL);
HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
ASSERT(hMap!=NULL);
WORD* lpvFile=(WORD *)::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);然后针对每一个WORD数据,我按下面方法读
m_Signal_CM1[i]=(float)(short)( ( lpvFile[8 * i ] >> 4 ) & 0xffff );
既然lpvFile为WORD型,lpvFile[8 * i ]便不是针对每一个WORD了,而是8个WORD之后了。m_Signal_CM1[i]=(float)(short)( ( lpvFile[i ] >> 4 ) & 0xffff );
即可
WORD* lpvFile;
既然lpvFile为WORD型,lpvFile[8 * i ]便不是针对每一个WORD了,而是8个WORD之后了。其实也不是8个WORD之后,而是每隔8个WORD来一次了不过这个应该可行C/C++ codem_Signal_CM1[i]=(float)(short)( ( lpvFile[i ] >> 4 ) & 0xffff );即可
还有LZ,别人都是把有效数据放在低位,你干嘛放高位啊?这样做会有问题。
CFile f;
f.Open(FileDlg.GetPathName(),CFile::modeRead);
int n = f.GetLength();
WORD*buf = new WORD[n/sizeof(WORD)+1];
f.Read((BYTE*)buf,n);
f.Close()然后在循环中
m_Signal_CM1[i]=(float)( buf[i] >> 4 );
你那个&0XFFFF没有用。最后delete [] buf;不要以为这 new 和 delete 使用了额外的内存,你那个映射文件同样也用了。