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)
在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
#6
初始化串口的内容可以放在对话框的.H文件中吗
#7
我这个软件是不是有问题啊,
Combo Box Properties 属性选择框中的Data只能输入一行数据,
没法输入第二行.
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)
在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
#6
初始化串口的内容可以放在对话框的.H文件中吗
#7
我这个软件是不是有问题啊,
Combo Box Properties 属性选择框中的Data只能输入一行数据,
没法输入第二行.
Combo Box Properties 属性选择框中的Data只能输入一行数据,
没法输入第二行.
#8
ctrl+enter
#9
OK, xie xie