串口通信问题:WINCE串口接收数据不完整

powerzone 2011-05-11 05:22:06
有2个窗口A、B, A是父窗口。A、B窗口都要接收串口数据,接收的内容不一样。串口初始化在A类内,A、B窗口都是创建线程来接收数据,调用相同的读函数(该函数在A类内实现), A 能正确接收到数据,而B页面,则不能完整接收数据(12个字节数据只收到6个左右,一般第一个字节和最后几个字节能收到)。读串口代码如下:如果在B页面调试时单步执行do~while循环体则可以接收完12个字节;如果在RealFile()函数后面增加Sleep(2)则可以将接收字节数增加到10个,但无论如何接收不完12个字节。串口初始化的读时延也进行过多次不同值设置,依然无解。另:波特率是4800,如果我跟PC机通信将波特率设置为19200并在RealFile()函数后Sleep(1),则可接收完12个字节,但采样模块只能用4800。

bReadResult = WaitCommEvent(handle_com, &dwCommModemStatus, 0);//等待事件发生
SetCommMask (handle_com, EV_RXCHAR | EV_CTS | EV_DSR | EV_TXEMPTY);//重新设置要等待的信号
if (bReadResult && (dwCommModemStatus & EV_RXCHAR)) //接收到数据
{
if (WaitForSingleObject(m_SysEvent, 500) == WAIT_OBJECT_0)
{
do
{
dwNumBytesRead = 0;
Byte = 0;
// Read the data from the serial port.

bReadResult = ReadFile(handle_com, &Byte, 1, &dwNumBytesRead, 0);
//Sleep(2);

// Display the data read.
if (dwNumBytesRead == 1)
{
data[len++] = Byte;
}
}while (bReadResult && (dwNumBytesRead == 1) && (len < MAX_FRAM_LEN));
}
}//end if

该问题困扰我2个星期一直得不到解决,望同行们给力,分析一下是什么问题造成的,谢过~
再问:程序从A进入B后,A的接收线程是不是被系统挂起了呢,也就是说该线程不工作了?
...全文
246 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
奶油小生 2011-10-17
  • 打赏
  • 举报
回复
我最近也在搞串口接收进程,发现当下位机发送过来的数据量很大时,串口接收线程就挂掉了,此时串口一直有数据过来,但是串口进程一直在等待事件发生。
powerzone 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wswwxk 的回复:]
引用 8 楼 powerzone 的回复:
引用 6 楼 wswwxk 的回复:

用A接收后,使用消息发送给B吧,简单

我是想进入B窗口接收数据并显示的,B是A的子窗口,从A进入B后A的接收线程还能工作吗?

都要工作的吧,A销毁了吗?
[/Quote]

下发命令后才有数据上来的,在B窗口时A不工作了,A并没有销毁,因为A是主窗口啊,如果销毁了只能退出程序了。
当我遇上-你 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 powerzone 的回复:]
引用 6 楼 wswwxk 的回复:

用A接收后,使用消息发送给B吧,简单

我是想进入B窗口接收数据并显示的,B是A的子窗口,从A进入B后A的接收线程还能工作吗?
[/Quote]
都要工作的吧,A销毁了吗?
91program 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 powerzone 的回复:]

引用 6 楼 wswwxk 的回复:

用A接收后,使用消息发送给B吧,简单

我是想进入B窗口接收数据并显示的,B是A的子窗口,从A进入B后A的接收线程还能工作吗?
[/Quote]


接收线程,最好只有一个。
否则,究竟是哪个接收线程接收了数据呢,没有办法判断的。
yf882 2011-05-13
  • 打赏
  • 举报
回复
自己封装一个虚拟串口类好了
powerzone 2011-05-13
  • 打赏
  • 举报
回复
不好意思,加不了分。。。
powerzone 2011-05-13
  • 打赏
  • 举报
回复
多谢各位同行的提点,在此再次谢过。
问题得到了解决。总结了以上各位提到的方法:一种是总是使用A接收,然后将属于B的数据通过消息发给B。第二种是:即13楼提到的方法:同一时间只能有一个接收线程在工作。我只尝试了第二种方法,但第一种也肯定可行。
我的方法亦即13楼同行的方法:在A进入B前将A的接收线程挂起,这样在B中就只有B一个接收线程了,然后从B返回A时将A的接收线程复位,此时B已被销毁。
这个问题一直拖了2个星期,解决只用了一分钟,原因是本人对windows运行机制理解不深,原以为进入B窗口后A的接收线程就会消息阻塞而不能工作,这样对B的接收线程没有产生影响。实际上A能正常工作是因为此时没有其他接收线程的干扰(因为要到B窗口才有B线程),而B则不同,2接收线程共存,会受到A的干扰,所以就造成了A能正常接收而B不能正常接收的错觉而找不到真正的原因。基于这些原因我所以在前面所第一种方法肯定也行。
正直今天本人生日,给各位甲方,犒劳一下大家。。。
linchunfu 2011-05-13
  • 打赏
  • 举报
回复
两个接收线程都有在运行,它们的调度是由系统支配的,只要你没有注销线程。
建议你在两个线程中用上互斥量,即A线程在接收完一段串口数据后,在进行下一笔接收前需等B线程接收完A线程接收到的串口数据,或是做成A接收完串口数据后,立即发消息给B线程接收数据,待B线程接收完数据A后方可再接收
powerzone 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hopease 的回复:]
B创建的,为啥A接收正确啊?
[/Quote]
我的意思是A、B类中都创建了接收数据的现场,但它们调用的是相同的接收函数,所以就觉得很疑惑,为什么A能正确接收,而B不行。
powerzone 2011-05-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wswwxk 的回复:]

用A接收后,使用消息发送给B吧,简单
[/Quote]
我是想进入B窗口接收数据并显示的,B是A的子窗口,从A进入B后A的接收线程还能工作吗?
cloudlgh 2011-05-12
  • 打赏
  • 举报
回复
学习,正在弄wince呵呵。
当我遇上-你 2011-05-12
  • 打赏
  • 举报
回复
http://download.csdn.net/source/3114525
看看我的测试代码
当我遇上-你 2011-05-12
  • 打赏
  • 举报
回复
用A接收后,使用消息发送给B吧,简单
hopease 2011-05-11
  • 打赏
  • 举报
回复
B创建的,为啥A接收正确啊?
powerzone 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 91program 的回复:]

最好是一个线程接收并分析,是A的交给A处理、是B的交给B处理
[/Quote]
是这样的啊,从父窗口A进入到子窗口B,B是创建了接受线程的
91program 2011-05-11
  • 打赏
  • 举报
回复
最好是一个线程接收并分析,是A的交给A处理、是B的交给B处理

19,504

社区成员

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

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