如何处理wince接收数据丢包的情况

xuebatiantang 2016-12-13 02:19:41
我的wince下处理数据的方法是由于是115200的波特率所以我设置每组40B的数据间隔5ms循环240发送过来,发送之后先存入我定义的一个1024*20的数组中,然后所有的发送结束后开始处理数组中的数据,在PC上通过串口助手进行实验数据接收情况特别好,但是存在着问题
一、将程序移植到wince上按理说是240组的数据,丢包率很高,而且我即使发送很小的数据也会丢,之前写的及时收及时处理的程序处理小量的数据不会丢包,但是到大数量就不理想。
二、我想通过判断数据中VA这个字符来根据系统时间创建文件,为什么我写的strTemp.Find(_T("VA")) != -1这一段一直不执行,我试过left等方法都不执行那一段语句,请问是什么问题

这是我的接受处理的代码,试验了好多次了,一直是没有找到解决的办法
CString str;

DWORD dwWrite = 0;//实际写入的字节量,作为返回值
int nTextLength;
if ((m_bPortOpened == FALSE) || (wParam & EV_RXCHAR) != EV_RXCHAR)
{
SetEvent(m_hPostMsgEvent);
return 0L;
}
//通知该函数处理数据,循环接收数据放到大数组中
DWORD dwLength = 0;
COMSTAT ComStat;
DWORD dwErrorFlags;
char* buf = new char[RECVSIZE];
ClearCommError(m_hComm, &dwErrorFlags, &ComStat);
dwLength = ComStat.cbInQue;

ReadFile(m_hComm, buf, dwLength, &dwLength, 0);
memcpy(&pRecvBuffer[pRecvNum], buf, dwLength);
pRecvNum += dwLength;//首地址移动写入数据的长度
nCount++;//写入一次+1,如果处理不同数据则根据具体情况选择判断依据
delete[] buf;
//数据接收完成存入数组中
if (nCount != 240)
{
SetEvent(m_hPostMsgEvent);
return 0L;
}
else
{
pRecvNum = 0;
nCount = 0;
}

CString strTemp;
strTemp.Format(_T("%s"), pRecvBuffer);

if (strTemp.Find(_T("VA")) != -1)
{
//创建文件,准备写入
}

//应该选择更合理的判断条件
for (int i = 0;i<240*40 ; i++)
{
switch (pRecvBuffer[i])
{

case 'W':
{
str += pRecvBuffer[i];
str += _T("\r\n");

DWORD strLength = str.GetLength()*sizeof(TCHAR);
WriteFile(hFile, str, strLength, &dwWrite, NULL);
//nTextLength = m_editReceive.GetWindowTextLength();
//m_editReceive.SetSel(nTextLength, nTextLength); //移动插入光标到正文末尾
//m_editReceive.SetSel(-1, 0);
//m_editReceive.ReplaceSel(str); // 向编辑视图中插入收到的字符
str.Empty();

break;
}
default:
str += pRecvBuffer[i];
}
}

ZeroMemory(pRecvBuffer, RECVSIZE);

AfxMessageBox(_T("yiqingkong"));
//使m_hPostMsgEvent成为有信号,即允许发送下一个WM_MY_MESSAGE消息
SetEvent(m_hPostMsgEvent);
return 0L;


...全文
272 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2016-12-14
  • 打赏
  • 举报
回复
串口速度太高,9600bps比较合适
91program 2016-12-14
  • 打赏
  • 举报
回复
引用 4 楼 xuebatiantang 的回复:
[quote=引用 2 楼 91program 的回复:] 先试试只接收、不处理,将接收到的数据通过十六进制 LOG 输出 目的:分析是接收的问题,还是数据处理的问题
最近有考试,没有及时回复您,老师,您说的方法我目前还做不到,这方面是第一次听到,不知道该怎么实现,您能给我一下这个测试的代码我学习应用,谢谢您[/quote] 这种方法有什么做不到的?简单的就是在: ReadFile(m_hComm, buf, dwLength, &dwLength, 0); 之后,直接将接收到的数据 buf 显示出来,后续的处理先注释。
  • 打赏
  • 举报
回复
char用strstr吧,何必转CString。你接收的东西难道是wchar?
xuebatiantang 2016-12-14
  • 打赏
  • 举报
回复
引用 2 楼 91program 的回复:
先试试只接收、不处理,将接收到的数据通过十六进制 LOG 输出 目的:分析是接收的问题,还是数据处理的问题
最近有考试,没有及时回复您,老师,您说的方法我目前还做不到,这方面是第一次听到,不知道该怎么实现,您能给我一下这个测试的代码我学习应用,谢谢您
xuebatiantang 2016-12-14
  • 打赏
  • 举报
回复
引用 1 楼 accessysq 的回复:
CString strTemp; strTemp.Format(_T("%s"), pRecvBuffer); 这个有bug。wince下用format最长只支持1k,你的数据太长了。
最近在忙考试,没有及时回复您,我之前试过一种方法就是

if(nCount == 1)
{
         char temp[100] = {0};
         memcpy(temp,buf,40);//只执行第一次接收时将数据判断是否有VA
         strTemp.Format(_T("%s"), buf);
}
可是这个find函数那一块还是不执行,试了好几种方法都不行,有没有其他的可以有效判断数据中字符串的函数,谢谢您
xuebatiantang 2016-12-14
  • 打赏
  • 举报
回复
引用 10楼91program 的回复:
直接将 buf 的数据输出,不要做任何处理
老师,我弄了一下午,一直不知道该怎么将buf中的数据输出出来,我用AfxMessageBox输出是乱码,直接将buf写入文件也是乱码,我不知道该怎么测试,您能具体说一下是怎么来测试吗,谢谢您,这段时间考试连着做实验的效率不高,您谅解
91program 2016-12-14
  • 打赏
  • 举报
回复
直接将 buf 的数据输出,不要做任何处理
xuebatiantang 2016-12-14
  • 打赏
  • 举报
回复
引用 6 楼 91program 的回复:
[quote=引用 4 楼 xuebatiantang 的回复:]
[quote=引用 2 楼 91program 的回复:]
先试试只接收、不处理,将接收到的数据通过十六进制 LOG 输出
目的:分析是接收的问题,还是数据处理的问题


最近有考试,没有及时回复您,老师,您说的方法我目前还做不到,这方面是第一次听到,不知道该怎么实现,您能给我一下这个测试的代码我学习应用,谢谢您[/quote]

这种方法有什么做不到的?简单的就是在:
ReadFile(m_hComm, buf, dwLength, &dwLength, 0);
之后,直接将接收到的数据 buf 显示出来,后续的处理先注释。[/quote]

老师,我不知道我测试的方法对不对,您看一下,我发送的数据是40B的数据,手动发送了6组时间间隔一秒左右,但是数据还是出现问题
ReadFile(m_hComm, buf, dwLength, &dwLength, 0);

for (int i = 0;i<40 ; i++)
{
str += buf[i];
}
delete[] buf;
DWORD strLength = str.GetLength()*sizeof(TCHAR);
WriteFile(hFile, str, strLength, &dwWrite, NULL);

我没有使用换行,时候来查看数据时自己添加的
91program 2016-12-13
  • 打赏
  • 举报
回复
先试试只接收、不处理,将接收到的数据通过十六进制 LOG 输出 目的:分析是接收的问题,还是数据处理的问题
  • 打赏
  • 举报
回复
CString strTemp; strTemp.Format(_T("%s"), pRecvBuffer); 这个有bug。wince下用format最长只支持1k,你的数据太长了。

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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