MSCOMM控件串口通讯关于接收数据的一些疑问 用MSCOMM控件进行串口的通讯.遇到下面的问题:发出命令后,硬件根据不同命令向串口回复一串数据,长度不定,而且也没有数据头和结尾标识.现在怎样进行缓冲,在硬件发完一个回复命令的所有数据后才进行接收处理,而不是接收到其中一部分就进行处理?该怎样设置串口的属性?该怎么处理接收事件?请指教!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主你好,我是在C#用的MSCOMM,以下是在C#的主要的代码,在VC中我一直用API函数,不想用MSCOMM,原因是在别的电脑使用时需要注册。在你向串口发数据之前,先设置如下 this.port.RThreshold=0; //port 是Mscomm的一个对象this.port.InputMode=MSCommLib.InputModeConstants.comInputModeText;//上述这样设置就是为了把接受到的数据存在串口的缓冲区里在Mscomm接受事件处理函数里,你这样处理 private void port_OnComm() { string rec=""; byte[] byin=(byte[])this.port.Input; if(byin.Length>0) //转化为char型 { for(int i=0;i<byin.Length;i++) { char c=(char)byin[i]; rec+=c.ToString(); } } 你试试在VC中实现上述代码。我的博客上有个C#开发终端式短信的例子,有源码,用的就是MSCOMM控件。你可以看看 问1:以前遇到过软件是通过单字节读取+Read超时做的。也就是说,时间控制!Read超时和ReadInterval超时。问2:在网上搜一下MSCOMM可以找到很多文章。常用的例如Comm.SetSettings("9600,n,8,1");问3:判断Comm.GetCommEvent()的返回值。常用:SERIAL_EV_RXCHAR -- 应该Read;SERIAL_EV_CTSSERIAL_EV_DSRSERIAL_EV_RLSD -- 应该更新状态线;SERIAL_EV_RX80FULL -- 缓冲区将满;当然还有其他事件例如报错,楼主看看SERIAL_EV_RX80FULL的定义就可以看全了。 回lfchen(一条晚起的虫):没有数据定义,不同的命令返回的数据是不一样的! 不定长的操作,不知道你是想干什么的。如果是字符串,那么就将接收到的数据都+=到一个CString里面,每收到一次就UpdateData()一次。直接显示到文本框里面 不同命令,返回的数据是有明确的定义的,是一些参数,比如线路信噪比,传输速率等等, 但是每次后面的值是不一定一样的比如:Rx Line Rate(kbps):2048 Local SNR Margin(dB):31.0等等 格式基本固定,但长度不固定!对于MSCOMM控件不知道有没有这样的函数,在收到数据后多长时间如果没有再收到数据,则执行某个事件?!这样就可以在发完命令后不再收到数据时认为接受结束,不知道这样可不可行? 呵呵,没有的,从串口读数据时,你是不知道会收到什么数据的,不然也就没有意义了。定义串口时,他有一个默认的等待时间(一般都设为300ms),在接受数据时,在大于300ms间隔内仍然没有数据上来时就判断此次数据传输结束。 你可以这样,在向串口发送数据后,间隔一段时间(Sleep主线程等待一段时间,例如500ms),然后你再读取硬件设备回传过来的数据,判断他是否完整,如果没有接受完,等待时间你可以设的长一些,例如800ms或者1s.你自己把握下吧。 可以在发送命令后在OnCommMscomm事件里采用定时延迟接收,一般你回命令的数据在很短时间内就会收到,给个时间延迟就可以实现进行你所需要的缓冲了 C 连接mysql 的问题,没有mysql的版块只能发这希望有人回答 WTL关于自画EDIT设置背景图的问题 CObList 中又有CObList 怎样遍历=============在线等 求助,学习初步中 文本反转(单词位置反转)的高效算法。 单击CListCtrl控件中某行某列得到item,subitem不正确,item有时为-1,何故?? 怪!百思不得其解! win2000的屏幕保护中有个“密码保护”选项,为什么我点选后没用呢? 有关电脑死机 算法难题!在线等待? CListView问题 __int64类型表示的时间到底指什么时间,起点是什么?单位是什么?
this.port.RThreshold=0; //port 是Mscomm的一个对象
this.port.InputMode=MSCommLib.InputModeConstants.comInputModeText;//上述这样设置就是为了把接受到的数据存在串口的缓冲区里
在Mscomm接受事件处理函数里,你这样处理
private void port_OnComm()
{
string rec="";
byte[] byin=(byte[])this.port.Input;
if(byin.Length>0) //转化为char型
{
for(int i=0;i<byin.Length;i++)
{
char c=(char)byin[i];
rec+=c.ToString();
}
}
你试试在VC中实现上述代码。我的博客上有个C#开发终端式短信的例子,有源码,用的就是MSCOMM控件。你可以看看
问2:在网上搜一下MSCOMM可以找到很多文章。常用的例如Comm.SetSettings("9600,n,8,1");
问3:判断Comm.GetCommEvent()的返回值。常用:
SERIAL_EV_RXCHAR -- 应该Read;
SERIAL_EV_CTS
SERIAL_EV_DSR
SERIAL_EV_RLSD -- 应该更新状态线;
SERIAL_EV_RX80FULL -- 缓冲区将满;
当然还有其他事件例如报错,楼主看看SERIAL_EV_RX80FULL的定义就可以看全了。
没有数据定义,不同的命令返回的数据是不一样的!
比如:
Rx Line Rate(kbps):2048
Local SNR Margin(dB):31.0
等等