如何处理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;


...全文
321 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,你的数据太长了。
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,开发一个模仿微信客服交流平台的界面是一项普遍的需求,尤其是在构建企业级沟通工具时。这个名为"仿微信客服交流界面(具备聊天信息本地数据库存储功能)"的项目,致力于为用户创造一个类似于微信的互动体验,并且已经完成了聊天信息在本地数据库中的保存功能,以此保障信息的安全性和可恢复性。另外,项目还包含了网络传输的代码,旨在帮助开发者更好地理解和将此功能整合进自己的应用程序中。 现在让我们深入探究聊天界面的构建过程。微信客服交流界面通常由以下几个核心组件构成:用户个人照片、昵称展示、消息展示气泡、时间标记、输入区域以及发送控制键。这些组件需要经过细致的排布,以确保界面既清晰又便于使用。在用户界面设计方面,一般会采用 Material Design 或者 iOS 的 Human Interface Guidelines 来设计符合平台标准的界面。源代码文件 ChatUIDemo 可能包含了这一界面实现的代码,开发者可以通过查看和调整这个文件来个性化自己的聊天界面。 聊天信息在本地数据库中的存储是一项核心功能。在该项目中,或许选用了SQLite作为轻量级数据库,因为它易于集成,支持事务处理,适合存储结构化的数据,例如用户标识符、接收者标识符、消息内容、发送时刻等。通过运用SQL指令,能够执行数据的增加、删除、修改和查询操作,从而确保聊天记录的完整性和一致性。开发者可能需要关注如何将新接收到的消息添加到数据库中,以及如何从数据库中获取历史记录并在界面上进行展示。 在网络传输方面,可能通过HTTP或HTTPS协议来实现,并且使用了诸如AFNetworking(iOS)或O...
内容概要:本文围绕虚拟同步发电机(VSG)接入弱电网的序阻抗建模与稳定性分析开展研究,基于Matlab/Simulink平台搭建详细的仿真模型,系统复现并验证相关理论方法。研究重点包括VSG在弱电网条件下的正负序阻抗特性建模、基于小信号分析的扫频法建模流程、系统阻抗交互特性及潜在的失稳机理分析。通过具体仿真案例,深入探讨了VSG控制参数对系统稳定性的影响,旨在为新能源并网系统的稳定运行提供理论依据与技术支撑。该内容属于电力电子与电力系统稳定性交叉领域的前沿课题,具有重要的学术价值与工程应用前景。; 适合人群:具备电力系统分析、电力电子变换器控制等基础知识,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制、电力系统稳定性研究的研究生、科研人员及工程师;有志于复现高水平期刊论文中阻抗建模与稳定性分析方法的技术开发者。; 使用场景及目标:① 掌握虚拟同步发电机在弱电网中的序阻抗建模理论与实现方法;② 理解并实践基于扫频法的小信号稳定性分析全过程;③ 应用于构网型变流器、虚拟同步机等先进并网技术的稳定性研究与仿真验证。; 阅读建议:建议结合所提供的Simulink仿真模型与技术资料,按照文档结构循序渐进地学习,重点关注建模原理、仿真参数设置与结果分析过程,同时参考链接中的完整资源进行代码调试与深入探究。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估开展研究,利用Matlab代码实现对电动汽车群体作为灵活性资源参与电网辅助服务的建模与仿真分析。研究重点包括基于多面体聚合与闵可夫斯基和的电动汽车可调能力(功率容量)量化方法、其在多时间尺度调度中的响应特性建模、运行备用潜力的聚合评估,以及结合智能优化算法的仿真验证,旨在系统性分析电动汽车在提供运行备用方面的技术可行性、调控潜力与系统价值。; 适合人群:具备电力系统运行与控制、智能优化算法基础,以及Matlab/Simulink编程能力的高校研究生、科研机构研究人员及从事新能源并网、需求响应、智能电网相关工作的工程技术人员。; 使用场景及目标:①掌握电动汽车集群可调能力的数学建模与聚合评估方法;②研究电动汽车参与电力系统多时间尺度协调调度的实现机制;③为高比例可再生能源电力系统的灵活性提升与运行备用资源配置提供技术参考与仿真工具支持。; 阅读建议:建议读者结合文中提供的Matlab代码深入理解电动汽车聚合建模与备用能力评估的具体实现流程,重点关注多面体建模、闵可夫斯基和运算及优化求解部分,并可延伸学习同平台关于V2G、微电网调度等相关资源以构建完整的知识体系。

19,523

社区成员

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

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