有谁知道MSCOMM串行通信原理,什么时候触发commevent事件?我读缓冲区数据长度为什么不对

wazq 2004-12-17 10:15:36
int len;
LONG k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
bk=m_ctrlComm.GetInBufferCount();
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度


for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组

for(k=0;k<len;k++) //将数组转换为Cstring型变量

{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
b[k]=atoi(strtemp);
}


}


大家看看,当我发到好多个字符时, 我读缓冲区数据长度bk和len 都不是我实际收到的字节数,比如我收到11个,数据长度len显示为3,怎么才能得到实际的数据长度,这其中通信到底是什么原理呢?

另外,我想把接收到的数,分别存到数组b[k]中,为什么b[k]最大只能存进8个数,因为len的最大值只能是8,多于8时,又从1开始计数,怎么解决啊?
...全文
426 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SailorK 2005-06-04
  • 打赏
  • 举报
回复
wazq你好!
这个问题解决了嘛?
wazq 2005-01-05
  • 打赏
  • 举报
回复
到底用什么办法比较好呢?
jxfzamdzyx 2004-12-26
  • 打赏
  • 举报
回复
这个问题确实存在,每次读取后最大只能为8,但你可以用其它方法解决这个问题
wazq 2004-12-25
  • 打赏
  • 举报
回复
楼上也遇到了同样问题吗?那用MSComm控件是不是有它的局限性呢?到底怎样解决好一些?还有没有搞好的办法
一条晚起的虫 2004-12-22
  • 打赏
  • 举报
回复
好像是控件的原因,我一次发12个数据,要两次GetCommEvent()==2才接收完
让我怀疑mscomm就8个8个的发
wazq 2004-12-21
  • 打赏
  • 举报
回复
大家没有明白我的意思,在我的程序中,我设定的是SetRThreshold(1),
SetRThreshold(1)函数是当接收缓冲区有1个字符时,才触发OnComm事件,串口开始接收数据。我的意思是,在触发了OnComm事件之后,串口接收到的数据,可能有几百个字符,我想把这些字符存到我自定义的数组里。但是现在我发现,当OnComm事件触发以后,我读数的时候最多只能读到8个,多于8个就又从1开始。
而在我的程序中,在编辑框中显示我读进的字符时,m_strRXData有几百个字符,可是为什么我想把上述程序中的strtemp读到数组b[k]中,b[k]最多只能存8个呢?
likunfeng 2004-12-21
  • 打赏
  • 举报
回复
有点问题:
首先b[k]是一个局部变量因为“我读数的时候最多只能读到8个,多于8个就又从1开始”
所以“b[k]最多只能存8个呢”

m_strRXData在你的程序里应该是全局变量吧

“最多只能读到8个”可能和对方发送频率有关,但关键可能还是你设 SetRThreshold(1) 的原因
你把它设定为其他值试试,看看有什么规律 比如SetRThreshold(2)后是不是就成了16 ^-^

wazq 2004-12-21
  • 打赏
  • 举报
回复
希望有人帮帮我!
渴望中。。。。。
qrlvls 2004-12-19
  • 打赏
  • 举报
回复
产生字符接收事件的触发数可以设置
触发事件的类型也可以选择
likunfeng 2004-12-19
  • 打赏
  • 举报
回复
//m_Com : MSComm控件变量
m_Com.SetRThreshold(8);//当接收缓冲区有8个字符时触发OnComm事件

把8改大点或小点,以适应你每次接收字符的长度,这样只有接收缓冲区有你设定的字符个数时才触发OnComm事件

缓冲区长度与你的"又从1开始计数" 没有直接关系

需要注意的是你设定m_Com.SetRThreshold(8);当触发OnComm事件时接收到的字符必然是8个
lgchina97 2004-12-19
  • 打赏
  • 举报
回复
有一个函数可以设置触发的条件,比如你设置为1个字节的话,那么当接受缓冲区有1个字节,那么就有接收事件产生,当你设置为250个字节的时候,就是当接收缓冲区有了250个字节的时候,接收事件才产生。

但是mscomm控件操作有一定的局限性,建议用api写。
wazq 2004-12-19
  • 打赏
  • 举报
回复
up
wazq 2004-12-19
  • 打赏
  • 举报
回复
我的缓冲区长度设的是1024,我觉得跟缓冲区长度无关吧,len=safearray_inp.GetOneDimSize();中的len,它的最大值也只是8,如果大于8,它自动就把8舍去,从1开始计数。这是为什么呢?
liuguangxing 2004-12-17
  • 打赏
  • 举报
回复
MSCOMM控件,有一个属性可以设置缓冲区长度,当满时就调用这个commevent事件,其他的就可以迎刃而解了。。。。。。
好久没有做了,印象中,不一定对,呵呵

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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