7402|20

55

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

在线等!串口数据接收问题 [复制链接]

我现在的程序是在wince6中,在S3c6410中调试没得问题,换了块板子,也是wince6的,不过是arm9内核的,接受数据就一次,以后就接受不到了,用wince串口调试工具,板子发送出来,pc机可以接收,pc机发送发给下位机接收不到,我的串口接收程序是这样的,在接收线程中
          while (TRUE)
        {          
                if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
                {               
                        SetCommMask (ceSeries->m_hComm, EV_RXCHAR| EV_CTS | EV_DSR);
                        //GetCommMask(ceSeries->m_hComm, &evtMask);               
                        //表示串口 收到字符               
                        if (evtMask & EV_RXCHAR)   
                        {       
                                Sleep(10);
                                ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

                                willReadLen = cmState.cbInQue ;

                                if (willReadLen <= 0)
                                {
                                        continue;
                                }
                                readBuf = new BYTE[512];
                                ZeroMemory(readBuf,512);
                                //读取串口数据
                                ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
                              }
                      }
            }

最新回复

我把程序改了,他的驱动不支持字符触发事件  详情 回复 发表于 2009-12-25 01:08
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
换的那块板子给的测试代码是开个线程,然后就一直运行,
while (TRUE)
{  
readBuf = new BYTE[512];
ZeroMemory(readBuf,512);
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
......
}
就可以接受数据了,我的为什么就不可以呢,我的是等到有字符到就会触发啊,他的是一直在读串口
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
建议楼主, 再重新上电,多测几次,看是否都是:第一次能收到,之后就再也收不到。

也有可能是PC的串口被烧坏了。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 
不可能,我测试了一上午,两台PC,4个串口
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 wswwxk 的回复:
换的那块板子给的测试代码是开个线程,然后就一直运行,
while (TRUE)
{?
readBuf = new BYTE[512];
ZeroMemory(readBuf,512);
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
......
}
就可以接受数据了,我的为什么就不可以呢,我的是等到有字符到就会触发啊,他的是一直在读串口


你可以先用他的那个程序测试下,看是否能收到?
如果能收到,就可以排除硬件问题。

如果还是收不到,那就是赢家问题, 比如232的PHY是否有问题等等


软件方面:

建议把:
  1. if (willReadLen <= 0)
  2. {
  3. continue;
  4. }
复制代码

删掉,测试下、
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
我把所有相关的都删了
if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
                {               
                        SetCommMask (ceSeries->m_hComm, EV_RXCHAR| EV_CTS | EV_DSR);
                        //GetCommMask(ceSeries->m_hComm, &evtMask);               
                        //表示串口 收到字符               
                        if (evtMask & EV_RXCHAR)   
                        {       
                                Sleep(10);
                                ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);

                                willReadLen = cmState.cbInQue ;

                                if (willReadLen <= 0)
                                {
                                        continue;
                                }
都没要了,
我程序中只有一下的了
while (TRUE)
{
if(ReadFile(ceSeries->m_hComm, readBuf, 2, &actualReadLen,0));
{
     if(..)
     {
           ReadFile(ceSeries->m_hComm, readBuf, 2, &actualReadLen,0);
     }
...................
}
还有读不到数据,没反应
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

7
 
[url=http://download.eeworld.net/source/870333][/url]
你用这个试试看,如果也不行,基本可以推测是硬件或驱动的问题。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 
也就是说 用:
  1. while (TRUE)
  2. {  
  3. readBuf = new BYTE[512];
  4. ZeroMemory(readBuf,512);
  5. //读取串口数据
  6. ReadFile(ceSeries->m_hComm, readBuf, willReadLen , &actualReadLen,0);
  7. ......
  8. }
复制代码


也读不到数据?

如果是这样,就是你的开发板的串口有问题、

不过,你确认用上面那个程序 在你的板子行吗?
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

9
 
我就是用的他在上面测试的,这个测试工具也是等待字符才接受数据,所以没反应
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 
QQ:604914729 ,要不QQ聊

你可以进行6410 提供的UART 接口的RXD 与TXD短接,看你自己发送数据,自己能否收到?

再就是在232_PHY后,既是把开发板上那个连接PC的串口上的TXD与RXD短接。,看你自己发送数据,自己能否收到?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 7 楼 kyzf 的回复:
也就是说 用:
C/C++ codewhile (TRUE)
{  
readBuf=new BYTE[512];
ZeroMemory(readBuf,512);//读取串口数据ReadFile(ceSeries->m_hComm, readBuf, willReadLen ,&actualReadLen,0);
......
}

也读不到数据?

如果是这样,就是你的开发板的串口有问题、

不过,你确认用上面那个程序 在你的板子行吗?

这个代码可以,不过我的在mini2440和S3c6410中都正常啊,在他的板子上wince串口调试助手出现一样的问题,之前我还没有遇到过,看大家遇到没啊
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

12
 
你用示波器测了RXD上有数据过来么?另外,建议你用16进制的方式显示数据看看。
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 sunrain_hjb 的回复:
你用示波器测了RXD上有数据过来么?另外,建议你用16进制的方式显示数据看看。

示波器有数据,显示也是16进制的
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

14
 
我前面遇到过一次这个bug,你确认下是不是这种现象:
如果上电后pc先发数据,板子可以接收,而一旦板子发送数据,板子就不能再接收pc的数据了。

如果是这种情况,基本可以判断是驱动的问题,在驱动的发送函数里面把使能发送中断的语句去掉就好。
SL_TxIntrEx这个函数里面的EnSubINT(pHWHead, pHWHead->bTxINT);这一句去掉。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 congyue123 的回复:
我前面遇到过一次这个bug,你确认下是不是这种现象:
如果上电后pc先发数据,板子可以接收,而一旦板子发送数据,板子就不能再接收pc的数据了。

如果是这种情况,基本可以判断是驱动的问题,在驱动的发送函数里面把使能发送中断的语句去掉就好。
SL_TxIntrEx这个函数里面的EnSubINT(pHWHead, pHWHead->bTxINT);这一句去掉。

他的程序收发都正常
我现在的问题主要是我的是等待串口事件,他的是一直查询串口,我怀疑他的串口驱动不支持等待事件
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

16
 
正常来说串口的接收是中断的方式,如果你的驱动里面支持接收中断的话,用中断方式跟踪下。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
学习了。
 
 
 

回复

48

帖子

0

TA的资源

一粒金砂(初级)

18
 
正在学习串口编程
mark
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

19
 
你是同步方式打开还是异步方式,WINCE下是不支持异步的,我看你的程序好象是异步啊
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

20
 
什么都不要删,将Sleep(10);
改成Sleep(1);试看看
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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