有谁知道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开始计数,怎么解决啊?
...全文
418 14 打赏 收藏 转发到动态 举报
写回复
用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事件,其他的就可以迎刃而解了。。。。。。
好久没有做了,印象中,不一定对,呵呵
串行通信主要用了C# 中的SerialPort类 开发语言:C# 程序运行环境:.NetFrameWork 2.0以上版本 开发工具:Visual Studio 2008 C# System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步 I/O 和事件驱动的 I/O、对管脚和中断状态的访问以 及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using System.IO.Ports。 串口的通讯参数 a.通讯端口号 [PortName]属性获取或设置通信端口,包括但不限于所有可用的 COM 端口,请注意该属性返回类型为String。通常情况下,PortName正 常返回的值为CO1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件中CommPort属性不能超过16的限止,大大方便了用户 串口设备的配置。 b. 通讯格式 SerialPort类对分别用[BaudRate]、[Parity]、[DataBits]、[StopBits]属性设置通讯格式中的波特率、数据位、停止位和校验位,其 中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parity类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚 举了None、One、OnePointFive、Two。 SerialPort类提供了七个重载的构造函数,既可以对已经实例化的SerialPort对象设置上述相关属性的值,也可以使用指定的端口名称 、波特率和奇偶校验位数据位和停止位直接初始化 SerialPort 类的新实例。 3.串口的打开和关闭 SerialPort类是调用类的Open()和Close()方法。 4. 数据的发送和读取 Serial类调用重载的Write和WriteLine方法发送数据,其中WriteLine可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法 有许多,其中除了ReadExisting和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定 的时间值后,引发ReadExisting异常。 5.DataReceived事件事件类似于MSComm控件中的OnComm事件,DataReceived事件在接收到了[ReceivedBytesThreshold]设置的字符个数或接收到了文件结 束字符并将其放入了输入缓冲区时被触发。其中[ReceivedBytesThreshold]相当于MSComm控件的[Rthreshold]属性,该事件的用法与 MsComm控件的OnComm事件CommEvent为comEvSend和comEvEof时是一致的

16,472

社区成员

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

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

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