佚名通过本文主要向大家介绍了扫描枪 wince,车载导航wince系统,wince应用软件下载,工控机wince系统,wince开发教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: wince数据读取方面的问题
描述:
我做过异步IO的实验,数据接收很稳定,但是wince不支持这种方式,我想问问各位老师怎样能够实现数据快速发送过来的稳定接收并且正确显示出来,并写csv文件中。
现在有一个想法是把数据弦存在一个大缓冲区中,然后在根据每组数据的格式分别从缓冲区中读取,但是还有几个问题没有想明白
1.如何定义这个大的缓冲区,怎样定义一个读写方面并且能够合理存储数据的缓存区;
2.定义这个缓冲区之后应该怎样从其中每次读取指定的长度的数据
想法不成熟,望各位老师给予指点和帮助
解决方案1:
描述:
wince不支持异步IO,结合上次各位老师给的意见,将wince下的接收数据的函数进行了更改,然后在串口助手上以10ms的速度发送数据,但是在数据显示方面还是没有达到理想的状态,数据显示如下图
代码如下
void CALLBACK CSerialPortDlg::OnCommRecv(CWnd* pWnd, char *buf, int buflen)
{
CString tmp;
CSerialPortDlg * pDlg = (CSerialPortDlg*)pWnd;
CEdit *pRecvStrEdit = (CEdit*)pDlg->GetDlgItem(IDC_EDIT_RECV);
for (int i = 0; i < buflen; i++, buf++)
{
tmp.Format(_T("%c"), *buf);
pDlg->m_strRECV += tmp;
}
pDlg->m_strRECV += _T("\r\n");
pRecvStrEdit->SetWindowText(pDlg->m_strRECV); // 将接收到的数据显示在窗口上
}
DWORD CSerialPortDlg::CommRecvTread(LPVOID lparam)
{
DWORD evtMask;
DWORD dwReadErrors;
COMSTAT cmState;
DWORD willReadLen;
DWORD actualReadLen = 0;
char *recvBuf = new char[1024];
CSerialPortDlg *pDlg = (CSerialPortDlg*)lparam;
PurgeComm(pDlg->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR);
SetCommMask(pDlg->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);
while (TRUE)
{
if (WaitCommEvent(pDlg->m_hComm, &evtMask, 0))
{
SetCommMask(pDlg->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);
if (evtMask & EV_RXCHAR)
{
ClearCommError(pDlg->m_hComm, &dwReadErrors, &cmState);
willReadLen = cmState.cbInQue;
if (willReadLen <= 0)
{
continue;
}
ReadFile(pDlg->m_hComm, recvBuf, willReadLen, &actualReadLen, 0);
//如果读取的数据大于0,
if (actualReadLen>0)
{
OnCommRecv(pDlg, recvBuf, actualReadLen); // 接收成功调用回调函数
}
}
}
//如果收到读线程退出信号,则退出线程
if (WaitForSingleObject(pDlg->m_ExitThreadEvent, 0) == WAIT_OBJECT_0)
{
break;
}
}
delete[] recvBuf;
return 0;
}
我做过异步IO的实验,数据接收很稳定,但是wince不支持这种方式,我想问问各位老师怎样能够实现数据快速发送过来的稳定接收并且正确显示出来,并写csv文件中。
现在有一个想法是把数据弦存在一个大缓冲区中,然后在根据每组数据的格式分别从缓冲区中读取,但是还有几个问题没有想明白
1.如何定义这个大的缓冲区,怎样定义一个读写方面并且能够合理存储数据的缓存区;
2.定义这个缓冲区之后应该怎样从其中每次读取指定的长度的数据
想法不成熟,望各位老师给予指点和帮助
解决方案1:
居然用9600,然后还发这么多数据。
用115200,然后用之前的代码测试看看,通过了再试试在ui上显示。
你应该是两帧一起收了,这很正常。你读取慢了就这样。
你的接收后处理显示的代码本来就没啥效率。在OnCommRecv中,你可以先处理当前数据不累加,然后直接在vs打印出来,不要SetWindowText,这样看看效果。
数据多了,字符串+操作慢,然后用SetWindowText显示就更离谱的,起码优化一下。
就算你优化了,你也要考虑数据的不完整性,连帧等问题的处理。
你的数据不是收的挺好吗,没看出问题啊
加数据校验,然后定义一些帧格式方便断帧就ok了。
大的缓冲区,说白一点就是一块大的内存。
缓存在此缓冲区的数据,需要 LZ 你自己管理与计数,然后确定读的机制:如计数达到多少,就去读等等......