急,在线等待! 菜鸟:关于用VC6做串口通信,MSComm 控件该怎么用?

jessiepan 2006-03-31 03:34:49
我现在已经用 Visual C++6 建立了一个基于对话框的MFC应用程序,然后在当前Project中添加了MSComm 控件,"Microsoft Communications Control,version 6.0" ,也看到了那个类似“电话机”的小图标。 结果,点击了那个电话机图标后,出现了错误提示,如下:

The ActiveX control cannot be instantiated.

The ActiveX control "Microsoft Communications Control,version 6.0" could not be instantiated because it requires a design-time license.

这是什么意思啊? 请大虾指点一下。。
...全文
950 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
一条晚起的虫 2006-05-16
  • 打赏
  • 举报
回复
0A6E7435 //字符串还是一个DWORD?
CString s = "10.110.116.53";
unsigned char a[4];
sscanf(s, "%d.%d.%d.%d", a, a+1, a+2, a+3);
一条晚起的虫 2006-05-15
  • 打赏
  • 举报
回复
不是分的问题。只是现在除了关注的人之外,可能已经没人看你的贴了。
jessiepan 2006-05-15
  • 打赏
  • 举报
回复
lfchen(一条晚起的虫), 谢谢。不好意思啊!可以另开一帖,再放分给你哦。 但我的问题还没问完啊。。。

我没有象你写的那样用,而是按照hanlin382() 写的类似用法。 定义一个m_ctrlipbox的控制变量,
CString s;
m_ctrlipbox.GetWindowText(s); // read ip address

比如:我输入的IP地址为10.110.116.53,则s="10.110.116.53"。 现在又出现了新的问题,我怎么把="10.110.116.53"转成 0A6E7435的 16进制呢?

thanks ...
weasea 2006-05-15
  • 打赏
  • 举报
回复
呵呵,这个楼主相当有趣
虫子忍不住了
哈哈
一条晚起的虫 2006-05-15
  • 打赏
  • 举报
回复
楼主,能不能另开一个贴?
找到你的问题不容易啊。
一条晚起的虫 2006-05-15
  • 打赏
  • 举报
回复
BYTE ip0, ip1, ip2, ip3;
CIPAddressCtrl* pIP = (CIPAddressCtrl *)GetDlgItem(IDC_IP);
pIP->GetAddress(ip0, ip1, ip2, ip3);
jessiepan 2006-05-15
  • 打赏
  • 举报
回复
谢谢 hanlin382() 啊! 已经实现了,OK。

我还有问题啊 :( 我现在又用到了IP address control,不知道怎么用。我怎么才能取到输入的IP地址的值呢?是不是和 Combo BOX的用法内似呢??

请各位大哥指点小弟我一二啊! thanks ...
hanlin382 2006-04-25
  • 打赏
  • 举报
回复
CString s;
m_ctlBox.GetWindowText(s);

s就是选的值
hanlin382 2006-04-25
  • 打赏
  • 举报
回复
不用响应什么消息、和事件的定义一个combobox的控制变量直接得到你选的那个值的。我用过啊
jessiepan 2006-04-25
  • 打赏
  • 举报
回复
我是楼主,还是关于这个串口通信的程序。
各位大哥大姐,我还是刚开始学用 VC++ 6 写程序,遇到了太多弱弱的问题,想提出来:

我在程序里用到了combo box ,定义了一个下拉菜单,想用来选择通信的波特率。关于这个combo box 上,有很多的 message/events:CBN_CLOSEUP, CBN_DBLCLK, CBN_DROPDOWN, CBN_EDITCHANGE, CBN_EDITUPDATE, CBN_ERRSPACE, CBN_KILLFOCUS, CBN_SELCHANGE....等等, 我该为哪个message/events 添加我的程序代码呢?不明白这些message/events 的意思? 不像定义一个 BUTTON,也就单击和双击两个 message/events ,简单。

哪位能提供一些关于这些控件(比如:IP Address,Combo BOX,LIST BOX....)的使用方法和部分程序代码的资料?给小弟我一些关于这方面的好的学习网站?

不胜感激啊! thanks ...
jessiepan 2006-04-20
  • 打赏
  • 举报
回复
lfchen(一条晚起的虫),不是的吧?!。。。 应该不是这么改的啊。

我写的部分代码,如下:

void CMy232DEMO1Dlg::OnRadioCOM1()
{
// TODO: Add your control notification handler code here
// 初始化 COM1
m_ctrlComm.SetCommPort(1); // USE COM1
m_ctrlComm.SetInputMode(1);
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(1024);
m_ctrlComm.SetSettings("4800,n,8,1");
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(true); // If COM1 Not Open, then Open COM1
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.SetInputLen(0);
m_ctrlComm.GetInput();
}

void CMy232DEMO1Dlg::OnComm()
{
// TODO: Add your control notification handler code here
// 由COM1口接收数据,并在窗口中显示出来
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
byte rxdata[2048];
CString strtemp;
if (m_ctrlComm.GetCommEvent()==2)
{
variant_inp=m_ctrlComm.GetInput();
safearray_inp=variant_inp;
len=safearray_inp.GetOneDimSize();
for (k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);

for (k=0;k<len;k++)
{
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
m_strEditRXDATA+=strtemp;
}
}
UpdateData(false);
}
m_strEditRXDATA 是定义的 CString 类型的变量。

void CMy232DEMO1Dlg::OnButtonManualSend()
{
// TODO: Add your control notification handler code here

UpdateData(true);
m_ctrlComm.SetOutput(COleVariant(m_strEditTXDATA)); // send data
}

m_strEditTXDATA 是定义的 CString 类型的变量。发送的数据,比如:123, 到另外一个串口接收后,则是"123'这个字符串的ASCII:0x31,0x32,0x33 。

如何实现发送和接收的数据由现在的字符型,改成 16 进制的呢?

thanks ...
一条晚起的虫 2006-04-13
  • 打赏
  • 举报
回复
MSComm.InputMode = 1
jessiepan 2006-04-13
  • 打赏
  • 举报
回复
下面的这段代码是实现串口数据的发送,m_strEditTXDATA 是定义的 CString 类型的变量。

void CMy232DEMO1Dlg::OnButtonManualSend()
{
// TODO: Add your control notification handler code here

UpdateData(true);
m_ctrlComm.SetOutput(COleVariant(m_strEditTXDATA)); // send data
}

发送的数据,比如:123, 到另外一个串口接收后,则是:0x31,0x32,0x33 。
如何实现发送的数据由现在的字符型,改成 16 进制的发送呢?

thanks ...
jessiepan 2006-04-12
  • 打赏
  • 举报
回复
OK,还是关于最开始的那个串口通信的程序,现在串口的发送和接收数据都能正常了。不过,还有点不太好的地方,我想改改。

CMSComm控件在发送数据和接收数据窗口显示时,都是使用了CString类型的变量。我能不能把发送数据和接收数据都改成 16 进制呢?该怎么进行转换呢??

请各位大哥指点小弟我一二啊! thanks ...
jessiepan 2006-04-11
  • 打赏
  • 举报
回复
恩, 谢谢 lfchen(一条晚起的虫) , 呵呵,问题解决了!

小弟我还想问一个弱弱的问题:在 VC++6.0 里如何设置 Project 的编译环境?比如:本来我的程序是调用了 LIB 库的,我现在不用 LIB 库了,改成 DLL 动态链接。 如何改??

请各位大哥指点小弟我一二啊! thanks ...
一条晚起的虫 2006-04-10
  • 打赏
  • 举报
回复
有没有程序用了COM2?
jessiepan 2006-04-10
  • 打赏
  • 举报
回复
谢谢 yefanqiu(叶帆:http://blog.csdn.net/yefanqiu) ,OK 了!

还是关于最开始的那个串口通信的程序,我的新问题: 我现在在我程序的主窗口里,定义了两个Radio Button,想用来选择 COM1 或是 COM2进行通信 。 代码如下:

void CMy232DEMO1Dlg::OnRadio1COM1()
{
// TODO: Add your control notification handler code here

m_ctrlComm.SetCommPort(1); // USE COM1
m_ctrlComm.SetInputMode(1); //
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(1024);
m_ctrlComm.SetSettings("4800,n,8,1");
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(true);
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.SetInputLen(0);
m_ctrlComm.GetInput();
}

void CMy232DEMO1Dlg::OnRadio2COM2()
{
// TODO: Add your control notification handler code here
m_ctrlComm.SetCommPort(2); // USE COM2
m_ctrlComm.SetInputMode(1); //
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(1024);
m_ctrlComm.SetSettings("4800,n,8,1");
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(true); // Open COM2
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.SetInputLen(0);
m_ctrlComm.GetInput();
}

程序编译可以通过,LINK 也OK。运行后,在主窗口中先选择了 COM1 的Radio Button,正常;然后再选择COM2的Radio Button时,出现错误提示:端口已打开? 这是怎么回事啊??
我的机器里有COM1和COM2 两个串口了。

请各位大哥指点小弟我一二啊! thanks ...
一条晚起的虫 2006-04-10
  • 打赏
  • 举报
回复
if(!m_ctrlComm2.GetPortOpen())
m_ctrlComm2.SetPortOpen(true); // Open COM2
else
{
//做一些处理,比如MessageBox("串口2已被占用");
return ;
}
一条晚起的虫 2006-04-10
  • 打赏
  • 举报
回复
一个COM,一个MSCOMM,相互独立,不用去管另一个。

m_ctrlComm2.SetCommPort(2); // USE COM2
m_ctrlComm2.SetInputMode(1); //
m_ctrlComm2.SetInBufferSize(1024);
m_ctrlComm2.SetOutBufferSize(1024);
m_ctrlComm2.SetSettings("4800,n,8,1");
if(!m_ctrlComm2.GetPortOpen())
m_ctrlComm2.SetPortOpen(true); // Open COM2
else
return ;
m_ctrlComm2.SetRThreshold(1);
m_ctrlComm2.SetInputLen(0);
m_ctrlComm2.GetInput();

jessiepan 2006-04-10
  • 打赏
  • 举报
回复
哦,谢谢 kb219(kkw2006) , 我现在是创建了两个m_ctrlComm对象,m_ctrlComm对应COM1口,m_ctrlComm2对应COM2口。 相应的代码如下:

void CMy232DEMO1Dlg::OnRadioCOM1()
{
// TODO: Add your control notification handler code here
m_ctrlComm.SetCommPort(1); // USE COM1
m_ctrlComm.SetInputMode(1); //
m_ctrlComm.SetInBufferSize(1024);
m_ctrlComm.SetOutBufferSize(1024);
m_ctrlComm.SetSettings("4800,n,8,1");
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(true); // Open COM1
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.SetInputLen(0);
m_ctrlComm.GetInput();

m_ctrlComm2.SetCommPort(2);
if(m_ctrlComm2.GetPortOpen())
m_ctrlComm2.SetPortOpen(false); // Close COM2

}

void CMy232DEMO1Dlg::OnRadioCOM2()
{
// TODO: Add your control notification handler code here
m_ctrlComm2.SetCommPort(2); // USE COM2
m_ctrlComm2.SetInputMode(1); //
m_ctrlComm2.SetInBufferSize(1024);
m_ctrlComm2.SetOutBufferSize(1024);
m_ctrlComm2.SetSettings("4800,n,8,1");
if(!m_ctrlComm2.GetPortOpen())
m_ctrlComm2.SetPortOpen(true); // Open COM2
m_ctrlComm2.SetRThreshold(1);
m_ctrlComm2.SetInputLen(0);
m_ctrlComm2.GetInput();

m_ctrlComm.SetCommPort(1);
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(false); // Close COM1

}

程序编译可以通过,LINK 也OK。运行后,在主窗口中先选择了 COM1 的Radio Button,正常;然后再选择COM2的Radio Button时,出现错误提示:端口已打开? 这是怎么回事啊?? 我在使用一个COM口时,不是已经关闭了另外的一个COM口。。
我的机器里有COM1和COM2 两个串口了,而且也没有别的程序在使用COM2口了!

请各位大哥指点小弟我一二啊! thanks ...
加载更多回复(8)

16,472

社区成员

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

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

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