阅读:1245回复:1
问下老手关于FLAGB占空比的问题 老丢数据我用的是SLAVE FIFO模式,发现FULL标志(也就是FLAGB)大多数时间是满,很少时间是不满 前端通过FPGA用11K的时钟写入16位数据时后面得到的数据基本正确。再快点就会丢数据 奇怪的时如果FPGA写入时钟SLWR变慢了之后虽说FIFO不空的时间变长了,但是空的时间也变长了,总体看来:占空比不变。 再一个问题: 驱动从FIFO的BUFFER里面读出来之后是不是直接写再PC的一个BUFFER里面了?如果是的话,当PC的BUFFER写满了会出现什么情况呢?怎么样才能知道PC里面的BUFFER的状态以便及时读取。 我现在用的是一个循环不断的读,还是感觉跟不上速度啊。读得太慢了 大致读取程序是这样的 int cnt=100; while(--cnt){ doRead(1024);//一次读取1024Bytes. } 谢谢大家不吝指教先。 下面是VC的界面读取和保存代码,这样得到得结果很搞笑,就是如果doRead(1022)(只要小于1024就会)读出得数据就是上一次的重复,真奇怪,我是从1写到65535的,如果每次只读1022字节的话,读出来的数据就会是1-511,1-511,1-511,。 如果设成1024就会丢数据,固件设的是1024×2缓存的 SLAVEFIFO 芯片用的68013A void CUSBDlg::OnRead() { // TODO: Add your control notification handler code here int cnt=100; while(--cnt){ m_bRead = true; Delayu(100000); doRead(1024); } } void CUSBDlg::doRead(int n) { ULONG i = 0; unsigned char *bufOutPut=NULL; ULONG nRead = 0; ULONG nOutput = 0; CHAR bufInput[1] = {0x00}; CString tempStrH = "";//用于临时保存每一个16位数据的高字节和低字节 CString tempStrL = ""; CString tempStr = ""; CString m_strBGSave= ""; CString bgfilename="E:\\bg_usb_data.txt"; nRead = n; if(m_bRead) { bufOutPut = new unsigned char[nRead+1]; memset(bufOutPut,0,sizeof(unsigned char)*nRead); if (bufOutPut == NULL) { MessageBox("Failed to allocate buffer for read"); } else //successfully to allocate the buffer { if (!DeviceIoControl(m_hUsb, DRIVER_IOCTL_802, bufInput, 1, bufOutPut, nRead, &nOutput, NULL) ) { MessageBox("Failed to open the handle!"); } else //successfully to open the handle { ReadFile(m_hUsb, bufOutPut, nRead, &nOutput, NULL); m_bRead = false; m_strBGSave=""; for(i=0;i<nRead;i+=2) { tempStrL.Empty(); tempStrH.Empty(); if (*bufOutPut< 16)//前面补0//驱动先读出的是低字节) { tempStrL = "0"; tempStr.Format("%X",*(bufOutPut)); tempStrL += tempStr; bufOutPut++; } else { tempStrL.Format("%X",*(bufOutPut)); bufOutPut++; } if (*bufOutPut< 16)//前面补0//高字节 { tempStrH = "0"; tempStr.Format("%X",*(bufOutPut)); tempStrH += tempStr; bufOutPut++; } else { tempStrH.Format("%X",*(bufOutPut)); bufOutPut++; } m_strBGSave = m_strBGSave + tempStrH + tempStrL + " "; //m_strDisData = m_strDisData + tempStrH + tempStrL + " "; // m_strReadData = m_strReadData+ tempStrH + tempStrL + " "; } BGSave(bgfilename,m_strBGSave); UpdateData(FALSE); } } } } void CUSBDlg::BGSave(CString bgfilename,CString m_strBGSave) { ULONG m_length = 0; CFile BGFile; CFileFind finder; CFileException e; m_length =m_strBGSave.GetLength() ; if(!finder.FindFile(bgfilename)) BGFile.Open(bgfilename,CFile::modeCreate|CFile::modeWrite,&e); else //BGFile.Open(bgfilename,CFile::modeWrite|CFile::modeCreate,&e); BGFile.Open(bgfilename,CFile::modeWrite,&e); BGFile.SeekToEnd(); BGFile.Write(m_strBGSave,m_length); BGFile.Close(); } |
|
沙发#
发布于:2007-08-29 22:20
void CUSBDlg::OnRead()
{ // TODO: Add your control notification handler code here int cnt=100; while(--cnt){ m_bRead = true; Delayu(100000); doRead(1024); } } 我的这个地方的Delayu(1000000)实际是没用的哈,刚才写错了 而且这个Delayu就是 void Delayu(int n){ for (int i=0;i<n;i++); } 不知道这个该怎么读取 |
|