请教VC++6.0串口通信问题

时间:2022-09-07 12:41:00
 Project菜单------>Add to Project---->Components and Controls----->Registered

   ActiveX Controls--->选择Components: Microsoft Communications Control,

   version 6.0 插入到当前的Workspace中。

结果添加了类CMSComm(及相应文件:mscomm.h和mscomm.cpp )。

  ⑵.在MainFrm.h中加入MSComm控件。

protected:

   CMSComm m_ComPort;

在Mainfrm.cpp::OnCreare()中:

  DWORD style=WS_VISIBLE|WS_CHILD;

   if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){

TRACE0("Failed to create OLE Communications Control\n");

return -1;   // fail to create

    }

  ⑶.初始化串口

m_ComPort.SetCommPort(1);  //选择COM?

m_ComPort. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes

m_ComPort. SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes//



if(!m_ComPort.GetPortOpen()) //打开串口

m_ComPort.SetPortOpen(TRUE);

m_ComPort.SetInputMode(1); //设置输入方式为二进制方式

m_ComPort.SetSettings("9600,n,8,1"); //设置波特率等参数



m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件

     m_ComPort.SetInputLen(0);

⑷.捕捉串口事项。

MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。

在MainFrm.h中:

protected:

afx_msg void OnCommMscomm();

DECLARE_EVENTSINK_MAP()

在MainFrm.cpp中:

BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd )  

ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)

           //映射ActiveX控件事件

END_EVENTSINK_MAP()

⑸.串口读写.

 完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型是:

VARIANT GetInput();及 void SetOutput(const VARIANT& newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。

无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样! WinNT支持宽字符, 而Win95并不支持。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:

    void CMainFrame::OnCommMscomm(){

     VARIANT vResponse;   int k;

if(m_commCtrl.GetCommEvent()==2) {      

k=m_commCtrl.GetInBufferCount(); //接收到的字符数目

if(k>0) {

vResponse=m_commCtrl.GetInput(); //read

SaveData(k,(unsigned char*) vResponse.parray->pvData);

} // 接收到字符,MSComm控件发送事件 }

   。。。。。 // 处理其他MSComm控件

}

void CMainFrame::OnCommSend() {

。。。。。。。。 // 准备需要发送的命令,放在TxData[]中

CByteArray array;

array.RemoveAll();

array.SetSize(Count);

for(i=0;i<Count;i++)

array.SetAt(i, TxData[i]);

   m_ComPort.SetOutput(COleVariant(array)); // 发送数据

}




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/CHUKAIHUA/archive/2008/09/14/2871578.aspx

9 个解决方案

#1


谢谢共享

#2


上面是网上的一个串口通信例子VC++6.0

    在Mainfrm.cpp::OnCreare()中: 

  DWORD style=WS_VISIBLE|WS_CHILD; 

   if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){ 

TRACE0("Failed to create OLE Communications Control\n"); 

return -1;   // fail to create 

    } 
   1。  这一步完成后,编译运行,出现“空文档创建失败”的消息框,请问是什么原因。
    2。    ⑶.  初始化串口的内容应该放在哪个文挡(如: .CCP)

#3


#4


为什么还动态创建啊?不是已经引入控件了吗,创建对象直接用不就行了。

#5


该回复于2011-03-01 13:35:57被版主删除

#6


初始化串口的内容可以放在对话框的.H文件中吗

#7


我这个软件是不是有问题啊,
    Combo Box Properties 属性选择框中的Data只能输入一行数据,
没法输入第二行.

#8


ctrl+enter

#9


OK, xie xie

#1


谢谢共享

#2


上面是网上的一个串口通信例子VC++6.0

    在Mainfrm.cpp::OnCreare()中: 

  DWORD style=WS_VISIBLE|WS_CHILD; 

   if (!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){ 

TRACE0("Failed to create OLE Communications Control\n"); 

return -1;   // fail to create 

    } 
   1。  这一步完成后,编译运行,出现“空文档创建失败”的消息框,请问是什么原因。
    2。    ⑶.  初始化串口的内容应该放在哪个文挡(如: .CCP)

#3


#4


为什么还动态创建啊?不是已经引入控件了吗,创建对象直接用不就行了。

#5


该回复于2011-03-01 13:35:57被版主删除

#6


初始化串口的内容可以放在对话框的.H文件中吗

#7


我这个软件是不是有问题啊,
    Combo Box Properties 属性选择框中的Data只能输入一行数据,
没法输入第二行.

#8


ctrl+enter

#9


OK, xie xie