我目前的问题是:整个程序中使用一个MSCOMM控件,实现和下位机(单片机)的通讯.每次通讯前,双方先要握手,确认握手成功才能发送或接收相应的数据和命令.其中,上位机主动发送部分功能已经能基本实现.
也可以在每次发送数据之前,先成功的进行握手.(相关的握手,或数据发送等程序是在具体的控件事件中中实现,而不是在MSCOMM-ONCOMM事件中实现),再将相关数据发送到下位机.
但是当下位机主动发送数据,以及之前的握手协议要如何实现?是在MSCOMM-ONCOMM事件中,一直进行查询式接收数据?可是每次接收的数据又不是定长,如何处理?
急急急! 有高手可以通过MSN进行联系.

解决方案 »

  1.   

    http://www.gjwtech.com/scomm/scvbmscommwireless.htm
      

  2.   

    基于VC++和ActiveX控件的接收机 
    摘要本文介绍了使用VisualC++开发使用接收机与PC机通信的接口程序,利用ActiveX控件来简化程序设计难度的方法,并给出了详细的实现方法,具有一定的实用意义。关键词串口通信VisualC++ActiveX控件一、引言串行接口是微机与外部设备的主要通信接口之一。只需要一条信号线就可以进行单向数据传送。由于线路简单,价格相对较低,得到了广泛应用。2微机3RS-232723外部7设备 接收机TXDRXDGNDTXDRXDGND
    图1近距离时系统连接方式如果想利用串行接口来实现近距离通信(通常15米以内),可以采用图1的连接方式来实现。该接收机采用EIA-RS232C串行标准进行通信,其数据通信信号形式如下表:波特率(Baud)
    4800,9600,or19200bps数据位(Databit)
    8bits停止位(Stopbit)
    2bits校验位(Parity)
    Non流控制(FlowControl)
    XON/XOFF
    接收机接收通过串口接收来自PC机的控制命令后,进行相应的动作,完成相应的设置。那么如何在WINDOWS环境下快速有效地开发串口通信程序呢?一般情况下的串口通信无非采用两种方法:一是利用Windows的通信API函数,二是利用一些高级语言(如VC++等)来实现。Windows的API函数虽然使用面很广,但由于比较复杂而有一定的难度,而VisualC++的ActivateX控件,由于其灵活性与易用性而受广大计算机开发者的青睐,正成为主要的开发工具。二、ActiveX控件介绍ActiveX是Windows下进行应用程序开发的崭新技术,它的核心内容是组件对象模型COM(ComponentObjectModel)。ActiveX控件包括一系列的属性、方法和事件,使用ActiveX控件的应用程序和ActiveX控件之间的工作方式是客户/服务器方式,即应用程序通过ActiveX控件提供的接口来访问ActiveX控件的功能。MicrosoftCommunicationcontrol是Microsoft公司提供的简化Windows下串行接口收发数据的简便方法。下面介绍在VisualC++6.0环境下,用ActiveX通信控件来编程实现串口通信的方法和技巧。三、串口通信的编程实现用VC++的ActiveX控件来实现串口通信,是一种快速简洁而又简单的编程方法。下面简单介绍实现过程。2.1在程序中嵌入通信控件单击Project菜单中选择AddtoProject,再单ComponentsandControls,从弹出的对话框中单击RegisteredActiveXControls,然后在列表框中选择MicrosoftCommunicationsControl,version6.0,单击OK。之后注意到Project中新增加了一个类。通过查看类MSComm的源文件mscomm.cpp,我们可以了解这个控件的属性和使用方法,其中的Get...函数可以用来访问该属性的当前值,而Set...函数则用来设置该属性的新值。2.2利用串口通信类编程实现通信功能在添加了串口通信类之后,就可以在相应的程序中创建一个通信控件,然后通过调用串口通信类的成员函数来完成相应的数据接收和发送功能。三、串口通信的使用方法和技巧3.1通过人工映射事件自动响应函数通信控件的工作原理类似与中断方式,当有通信事件发生时(如发送数据、接收数据等),就会触发OnComm事件,在该事件的处理函数中调用OnCommEvent()函数,通过返回值即可确定是那类事件,再作出相应的处理。但需要注意的是,OnCommEvent()函数并不是自动映射的,必须手工添加该事件映射函数。其方法如下:示例中是在主框架类中调用通信控件类函数。所以先要在Mainfrm.h添加如下消息映射函数。afx_msgvoidOnCommEvent();然后在Mainfrm.cpp中添加如下代码BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd)ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommEvent,VTS_NONE)END_EVENTSINK_MAP()接下来就可以在voidCMainFrame::OnCommEvent()函数中处理各种串口响应事件。3.2串口收发数据时,若数据只用ANSI字符集,则用文本方式收发。对其它字符数据,如数据中有嵌入控制字符、Nulls等等,则使用二进制方式。其中一个需要注意的问题是函数SetInput()发送的是VARIANT型变量,而我们输入的一般是CString型变量,因此必须进行转换。先将CString型变量转换为BYTE型数组,再将转换为ColeSafeArray型变量,然后将其组转换为VARIANT型变量发送出去。这个转换过程看起来比较复杂,但它可以满足用不同的变量类型来发送数据。在串口接收数据时,也要做类似的变量类型转换处理。该转换的主要代码实现如下所示:voidCMainFrame::OnSendData(CStringm_strInputData,intkind){CStringstr,string;VARIANTstrReceive;BYTEdata[256];longi,length;COleSafeArraym_input2;length=m_strInputData.GetLength();//将Cstring型变量转换为BYTE型数组for(i=0;i
    data[i]=m_strInputData.GetAt(i);length++;//创建一个ColeSafeArray型变量数组m_input2.CreateOneDim(VT_UI1,length,data,0);//把字节数组转换成ColeSafeArray型变量for(i=0;i
    m_input2.PutElement(&i,data+i);//把ColeSafeArray型变量转换成VARIANT型变量strReceive=m_input2;//发送数据m_commctrl.SetOutput(strReceive);}3.3我们知道,每个使用的串口通信控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个控件。通常,PC机配有两个串行接口,分别以COM1和COM2标称。所以如果需要在同一应用程序中,对两个接收机进行遥控时,就可以通过创建两个串口通信控件来实现。并且PC机也可以根据需要添加新的串行接口硬件,所以通过多个串口通信控件就能很容易地实现与多个外部设备的通信。五、结束语本文实现了在windows98下用VisualC++来开发某侦察接收机与PC机串行通信的接口程序,并且利用ActiveX控件大大简化了程序设计的难度。本文给出了部分关键实现的代码,并根据作者开发经验,指出了需要注意的问题,具有一定的实用意义。 
      

  3.   

    谢了.不过我用的是VB,VC实在不是很懂.
    相关的也有看到过.还是没明白关键处.
      

  4.   

    对 
    我们都很弱 不懂c
    强烈要求用vb 实现
      

  5.   

    我也做的是这方面的程序,我想问一下,PC机这头我只想发数据到串口,为什么我设MSComm1.SThreshold = 1,MSComm1.RThreshold = 0时,不能触发OnComm事件呢
      

  6.   

    不清楚 我也在学习
    请问有这方面的qq群么 我的qq 是:3 0 8 1 7 7 6 7 5
      

  7.   

    to  lovebeethoven(小佛) , 每次接收的数据依据具体对应的编程命令,对应不同的数据值.每次单片机主动发送前,都要先和PC机进行握手.握手信息包括一个字节的握手信号(88),以及一个字节的关于接收数据的字节数.比如,单片机要发送0102030405,五个字节的内容过来,发之前,先和PC机握手,发了88和05两个字节的内容,收到PC机的正确的握手回应后,再将数据(0102030405五个字节的内容)发送过来,供PC机接收.目前的问题是,如何实时的使PC接收单片机发送过来的数据(包括要做答复的握手信息).而不过出现信息遗漏,是通过MSCOMM-ONCOMM查询式实现?按此方法,面对每次接收数据的字节数不同对RThreshold和InputLen属性做何设置呢?
    还是用一定时器控制实现?很头痛!