7364|18

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE下串口接收问题!!! [复制链接]

向GSM模块发送AT命令后,然后通过读线程读出模块响应。接收完后调用其他函数去处理接收到的数据,但是一次接收到的数据总是不完整的。例如发送AT,直接返回的是ATOK,但是每次总是先接收到AT或就一个A,就完了。要下一次才能接收到OK或TOK。 如何才能一次性接收到完整的响应呢???这个问题应该怎么解决呢????麻烦大家啦!
此帖出自WindowsCE论坛

最新回复

详细点,没明白你的意思!  详情 回复 发表于 2010-6-17 10:28
点赞 关注
 

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
这种情况应该是很普遍的,设定一个缓冲区,从缓冲区里读数据,读完以后清掉
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我之前也遇到过这种情况,很正常,我们有用两个DTU做点对点的通信测试,也会出现服务器方面接受到的数据帧不全,然后下一帧会把上一帧不全的数据给发过来!这个你要自己编写应对这种情况的代码,至于一次性接受到完整的数据,我也不清楚,帮不了你。
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
不可能这么差的。
楼主用串口调试助手试试,如果也会这样,那是你串口驱动有问题。

此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

5
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

6
 
谢谢各位了,但现在发现问题是,单步调试的时候串口能够读取完整的AT响应,并且再调用应用处理问题,没有任何错误。可是一连续运行,就有问题。这是怎么回事呢????麻烦各位帮帮忙呀~~
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

7
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
加延时
此帖出自WindowsCE论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

9
 
被其它任务打断了吧。1.增高优先级。2.增加fifo的深度。
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
呃,弱问一句,怎样提高优先级???
此帖出自WindowsCE论坛
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用楼主 kelanmn 的回复:
向GSM模块发送AT命令后,然后通过读线程读出模块响应。接收完后调用其他函数去处理接收到的数据,但是一次接收到的数据总是不完整的。例如发送AT,直接返回的是ATOK,但是每次总是先接收到AT或就一个A,就完了。要下一次才能接收到OK或TOK。 如何才能一次性接收到完整的响应呢???这个问题应该怎么解决呢????麻烦大家啦!


贴出你的代码看看,
你是怎么做的。一般都会采用WaitCommEvent 等待触发的,我这么做没有什么问题啊。
楼主这个数据量不大,是不是一些细节没有处理好。
[url=http://blog.eeworld.net/gooogleman/archive/2010/05/22/5615844.aspx][/url]
这里有我一些调试串口的一些经验,不知道是否对你有帮助了。呵呵。
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
  1. while (TRUE)
  2.         {   
  3.        
  4.                   if(WaitCommEvent(ceSeries->m_hComm1,&evtMask,0))
  5.                 {                       
  6.                         SetCommMask (ceSeries->m_hComm1, EV_RXCHAR | EV_CTS | EV_DSR );
  7.                         //表示串口收到字符               
  8.                          if(evtMask & EV_RXCHAR)
  9.                         {
  10.                                 //清除错误并查询状态
  11.                                 ClearCommError(ceSeries->m_hComm1,&dwReadErrors,&cmState);
  12.                                 willReadLen = cmState.cbInQue ;//接收缓冲区中存储的待读取的字符数
  13.                                 if (willReadLen <= 0)
  14.                                 {
  15.                     
  16.                                         continue;
  17.                                 }
  18.                        
  19.                                 readBuf = new BYTE[willReadLen+1];

  20.                
  21.                                 ReadFile(ceSeries->m_hComm1, readBuf, willReadLen, &actualReadLen,0);
  22.                                 //如果读取的数据大于0,
  23.                                 if(actualReadLen> 0)
  24.                                 {
  25.                                       WCHAR strmp[100]={0};
  26.                       MultiByteToWideChar(CP_ACP,0,(char *)readBuf,actualReadLen,strmp,actualReadLen);
  27.                                       ceSeries->m_strRespBuf+=strmp;
  28.                    SetEvent(ceSeries->m_hATCmdRespEvent);
  29.                    actualReadLen=0;
  30.                  }
  31.             }
  32.                 }
复制代码
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

13
 
我就贴了接收部分,退出线程的事件响应就没贴了。还要贴哪些呢?
如果是串口优先级低了,怎么提高呢?????????谢谢前面的各位了~~~
此帖出自WindowsCE论坛
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(初级)

14
 
你还可以在一包数据内加一些判断字符来判断一帧全接收后再处理。比如加一个帧头、帧长度等,再把两个时间接收到的数据一起处理。
此帖出自WindowsCE论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
根据你单步调试可以,我觉得是程序运行太快了,串口数据一返回(没有全部)就已经提交上来了。

程序不应该接到有数据就返回事件吧,而是等到接收到\r或\n结束符才返回事件
此帖出自WindowsCE论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

16
 
使用缓冲区把,
我一般的做法是 使用一个缓冲区,
一直在接受串口数据,当接收到有串口数据后
定时器开始记时,
超过 50MS 没有收到数据就认为一个完整的包已经结束,
另外

AT 指令集邮一个结束标示包的啊~!
你也可以用结束标示包来判断啊~!
此帖出自WindowsCE论坛
 
 
 

回复
斗破书迷191 该用户已被删除
17
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(高级)

18
 
嗯,判断是否有结束符号,然后再激活事件。感觉一小问题绕了好远啊。。。。不过还有问题就是断开连接,也就是关闭线程,关闭串口后。我再按重新连接,这时候串口打开了,但是写入AT命令,读线程没有任何反应。等我断开后,又打开。这时候又可以了。反反复复都是这样循环的。这是怎么回事呢?
此帖出自WindowsCE论坛
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

19
 
详细点,没明白你的意思!
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表