MSComm串口数据不完整怎么办

perfectly27 2008-03-10 12:17:03
有几种不同帧头的数据,从串口不断读入(每秒一次),经常一种数据没读完就读下一帧了,比如
$AAA,1,2,3,4,5,6,7,8,9,完$BBB,1,2,3,4,5(未完)(达到200字节)$CCC,1,2,3,4,5,6,7,8,9,完$....

所以数据处理起来老是跳变,难道SetRThreshold(200)参数还不够大吗,再大就这该怎么解决呢?
m_Comm.SetRThreshold(200);
length=safearray_inp.GetOneDimSize(); //验证得到有效数据长度
for(i=0;i<length;i++) //
{
if(data[i]=='$')//
{
for(int j=0;j<200;j++)//////////////////
{
m_Message+=data[i+j];//显示$各数据
}
...全文
219 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
walw521 2009-09-08
  • 打赏
  • 举报
回复
我也遇到这个问题了!楼主解决了么?
form1_load 2008-04-14
  • 打赏
  • 举报
回复
同病相连
perfectly27 2008-03-12
  • 打赏
  • 举报
回复
又发现得到的几种数据,有时候就只有头和尾,中间部分丢失
而且应该是每秒几种数据都有,但有的数据却可能几秒钟才看到一次,很郁闷啊!
for(i=0;i <length;i++) //
{
if(data[i]=='$')//这种开头有5种不同数据
{
for(i=0;i <length;i++)
{
m_Message+=data[i]; //

z_kris 2008-03-12
  • 打赏
  • 举报
回复
自己维护一个较大的缓冲区,定时将串口数据取出放入缓冲区中,然后手动粘包?
呵呵,貌似比较麻烦
perfectly27 2008-03-11
  • 打赏
  • 举报
回复
有谁知道啊?
perfectly27 2008-03-11
  • 打赏
  • 举报
回复
可能是我的代码有问题,请大家帮看看,辛苦了,谢谢。
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>..*hh
下面的程序目的是将<1> <2> <3> <4>...分别提取处理,data为char型

for(i=0;i<length;i++) //
{
if(data[i]=='$')//这种开头有5种不同数据
{
for(i=0;i<length;i++)
{
m_Message+=data[i]; //能显示串口全部信息
if((data[i+3]=='G')&&(data[i+4]=='G')&&(data[i+5]=='A')) //判断是否$GPGGA语句
{
int Douhao=0;//逗号计数
double shijian,weidu,jingdu,gaodu;//时间 经度 纬度...

union
{
unsigned char bytes[4];
unsigned int value;
}test;

for(int n=0;n<100;n++)/////////////????这里是不是有问题???////
{
if(data[i+n]==',') //
Douhao++; //逗号计数

else
switch(Douhao)
{
case 1:////////////////显示时间<1>
{
test.bytes[0]=data[i+n];
d+=test.value;
shijian=atoi(d);
m_TIME.Format("%g",shijian);
}
break;
case 2: ///////<2>应该是3912.34
{
test.bytes[0]=data[i+n];
c+=test.value;
weidu=atof(c);///纬度
weidu/=100;/////除100后应该显示39.1234,但有时是0.39或3.91...
m_B.Format("%g",weidu);///原因是只读到39或391,后面的数...

}
break;
case 3: /////////<3>
m_B+=data[i+n];//
break;
case 4:
{
test.bytes[0]=data[i+n];
e+=test.value;
jingdu=atof(e);
jingdu/=100;
m_L.Format("%g",jingdu);///和上面一样的问题
}
case 5:
m_L+=data[i+n];
break;
.....
fengfan 2008-03-11
  • 打赏
  • 举报
回复
很简单,把后面的for放入线程中。看效果如何!
Treazy 2008-03-10
  • 打赏
  • 举报
回复
你的问题是串口接收异常,还是你自己处理数据时间不够,导致未处理完,就直接收到下个数据,使得缓冲被冲掉?
perfectly27 2008-03-10
  • 打赏
  • 举报
回复
应该是你说的第3种,
因为刚学觉得这种最简单。
应该有解决的办法吧,不然MSComm就太失败了。不知道谁有这方面的经验
zh1369 2008-03-10
  • 打赏
  • 举报
回复
MSComm串口数据不完整怎么办
--------
没用过这个,大胆猜猜吧!
1、设备传来的数据就不完整。(这个可以找一个串口监控软件来跟踪察看一下)
2、mscomm 缓冲不够导致数据丢失(加快你的数据处理速度)
3、你的程序没有从mscomm 缓冲中读取完整数据。
-------
为什么不选择API?
perfectly27 2008-03-10
  • 打赏
  • 举报
回复
在m_Message编辑框中只按每次200字节显示(从$开始计)结尾肯定是未知的,然而下一个200字节,又从下一个$开始计,
导致有的数据不完整,这是不是MSComm的缺点呢,能解决吗?高手帮忙啊!!

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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