4246|9

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口读取数限制!!!! [复制链接]

串口能够写入多位数据,但是只能读出前8位,COMSTAT.cbInQue,在输入多位后,每次都是等于8.待将串口发送区清空后,WaitCommEvent还是能检测到EV_RXCHAR事件,这时COMSTAT.cbInQue=0.这是什么原因啊?怎样才能输出更多的数??

最新回复

定义好你读取的数据的数据结构,没有结构的数据输入感觉没有什么意义,定义好数据结构内每一个元素的大小,每个字节代表的意义也要心里有数,在定义结构体的时候写好说明,同时要注意字节对齐的问题,免得定义的结构体理论大小和在内存中的实际大小不符,new操作符要谨慎使用,lenux说的很有道理。  详情 回复 发表于 2008-5-11 07:50
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你的缓冲区是多大的?
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好像设置的是512,512.这应该足够了吧
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
512够了。

兄弟,直接上代码吧。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
以后需再关注,现在先帮你顶一下
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(中级)

6
 
//分配设备缓冲区
SetupComm(m_hComm,512,512);
读取串口的部分代码如下:
        //清空串口
        PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
       
        SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
        while (TRUE)
        {          
                if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
                {                       
                        SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
                        //表示串口收到字符               
                        if (evtMask & EV_RXCHAR)
                        {
                               
                                ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
                                willReadLen = cmState.cbInQue ;
               

                                if (willReadLen <= 0)
                                {
                                        continue;
                                }
                               
                                readBuf = new BYTE[willReadLen+1];
                                while(dwHaveBytesRead!=willReadLen)
                                {
                                 ReadFile(ceSeries->m_hComm, readBuf+dwHaveBytesRead, willReadLen-dwHaveBytesRead, &actualReadLen,0);
                                  dwHaveBytesRead= dwHaveBytesRead+actualReadLen;
                                }  
                                   readBuf[willReadLen]='\0';
                  
                                  if (dwHaveBytesRead)
                                {
                                        //触发读取回调函数
                                        ceSeries->m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,dwHaveBytesRead);
                                        dwHaveBytesRead=0;

                                }
                                 PurgeComm(ceSeries->m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR );
                               
                        }
                }麻烦你看下吧。。。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

7
 
发送给串口的数据并不是一次就能全部收到的。

你的接收处理部分有问题。

willReadLen = cmState.cbInQue ;  //此处表示在接收缓冲区里有的数据大小,也表示你目前能读到的大小
               

if (willReadLen  <= 0)
{
continue;
}

readBuf = new BYTE[willReadLen+1];  //难道你每次都要申请分配? 而且后面还不释放
                                         //应该一次申请一个足够大的内存块或者readBuf定义为一个数组
                                         //大小和缓冲区一样就行


while(dwHaveBytesRead!=willReadLen)  //这种做法应该是没有必要的。
                                          //如非要这么做,在while前加上dwHaveBytesRead = 0;
{
ReadFile(ceSeries->m_hComm, readBuf+dwHaveBytesRead, willReadLen-dwHaveBytesRead, &actualReadLen,0);
  dwHaveBytesRead= dwHaveBytesRead+actualReadLen;
}   
   readBuf[willReadLen]='\0';
                  
  if (dwHaveBytesRead)
{
//触发读取回调函数
//你的回调函数的处理要处理全部事情。
//因为每次回调传回的数据可能只有1个,也可能有512个。
//所以要有一个数据的拼装过程
ceSeries->m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,dwHaveBytesRead);
                                        dwHaveBytesRead=0;

}
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

8
 
最好自己定义一种协议,包里面含有数据长度等段.
 
 
 

回复

54

帖子

0

TA的资源

一粒金砂(初级)

9
 
还是不太懂哎。
readbuf会在后面释放。
while(dwHaveBytesRead!=willReadLen)  //这种做法应该是没有必要的。为什么呢?那要怎么做才好。dwHaveBytesRead在这段程序前是赋值0.
还有你说的回调函数,这里的回调函数是将readbuf所有的数据在edit控件里显示出来,总之是不懂呀。。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

10
 
定义好你读取的数据的数据结构,没有结构的数据输入感觉没有什么意义,定义好数据结构内每一个元素的大小,每个字节代表的意义也要心里有数,在定义结构体的时候写好说明,同时要注意字节对齐的问题,免得定义的结构体理论大小和在内存中的实际大小不符,new操作符要谨慎使用,lenux说的很有道理。
 
 
 

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

随便看看
查找数据手册?

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-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表