急,在线等待! 菜鸟:关于用VC6做串口通信,MSComm 控件该怎么用? 你建工程的时候,是否选中了ActiveX Controls 复选框? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://support.microsoft.com/kb/q155059/ OK。 谢谢 lixiaosan(小三) ,问题解决了! 把 VC++ 6 卸掉,重新装了一次,就可以了。奇怪? 我现在想用 VC 来做一个“媒体播放器”,该如何做? 音视频的数据流是通过TCP/IP的网络过来的,被压缩了,MP4。别人提供给了我一个MP4的解码的 DLL 库。 还是关于最开始的那个串口通信的程序。我现在用 CMSCOMM 的控件写了个 232串口收发的小程序,数据的收发都能正常了。在程序的主窗口里 有一个数据接收窗口(EditBox) 和一个数据发送窗口(EditBox), 我现在在旁边加了两个“显示清空”的按钮,我想实现用按钮清空窗口(EditBox)里的数据。该如何做呢?请各位大哥指点我一二啊! thanks ... 定义一个关于EditBox控件的内存变量m_EditBoxm_EditBox.SetWindowText(_T("")); 这样:m_SendData.Empty ();SetDlgItemText(IDC_Send,""); 谢谢 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 ... 如果想同时打开两个串口需要两个m_ctrlComm这种对象。如果只是想打开另外一个串口,那么要先关闭已经打开的前一个。 哦,谢谢 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 ... 一个COM,一个MSCOMM,相互独立,不用去管另一个。m_ctrlComm2.SetCommPort(2); // USE COM2m_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 COM2else return ;m_ctrlComm2.SetRThreshold(1);m_ctrlComm2.SetInputLen(0);m_ctrlComm2.GetInput(); if(!m_ctrlComm2.GetPortOpen()) m_ctrlComm2.SetPortOpen(true); // Open COM2else{ //做一些处理,比如MessageBox("串口2已被占用"); return ;} 恩, 谢谢 lfchen(一条晚起的虫) , 呵呵,问题解决了!小弟我还想问一个弱弱的问题:在 VC++6.0 里如何设置 Project 的编译环境?比如:本来我的程序是调用了 LIB 库的,我现在不用 LIB 库了,改成 DLL 动态链接。 如何改?? 请各位大哥指点小弟我一二啊! thanks ... OK,还是关于最开始的那个串口通信的程序,现在串口的发送和接收数据都能正常了。不过,还有点不太好的地方,我想改改。CMSComm控件在发送数据和接收数据窗口显示时,都是使用了CString类型的变量。我能不能把发送数据和接收数据都改成 16 进制呢?该怎么进行转换呢?? 请各位大哥指点小弟我一二啊! thanks ... 下面的这段代码是实现串口数据的发送,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 ... 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 ... 我是楼主,还是关于这个串口通信的程序。各位大哥大姐,我还是刚开始学用 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 ... 不用响应什么消息、和事件的定义一个combobox的控制变量直接得到你选的那个值的。我用过啊 CString s; m_ctlBox.GetWindowText(s);s就是选的值 谢谢 hanlin382() 啊! 已经实现了,OK。我还有问题啊 :( 我现在又用到了IP address control,不知道怎么用。我怎么才能取到输入的IP地址的值呢?是不是和 Combo BOX的用法内似呢?? 请各位大哥指点小弟我一二啊! thanks ... BYTE ip0, ip1, ip2, ip3;CIPAddressCtrl* pIP = (CIPAddressCtrl *)GetDlgItem(IDC_IP);pIP->GetAddress(ip0, ip1, ip2, ip3); 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 ... 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); 谁能给个VC6.0能用的BCG的下载 一个vc2005工程,里面很多文件,很多项目。如何知道某个文件都在那个项目内? m_pRecordset->Open 出错,怎么回事 无模式对话框的OnCancel后的疑问 如何在显示对话框时将焦点给一个指定的控件? 怎么样创建窗体。 请问一下关于无连接网络传输的问题? 关于SQL Server Transact-SQL API 的问题 急急急!!!哪儿寻找MFC042D.dll RichEdit 如何在CDialog里放一个CDialogbar?急~~ 求助:打开的.dat文件指针
m_EditBox.SetWindowText(_T(""));
m_SendData.Empty ();
SetDlgItemText(IDC_Send,"");
{
// 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 ...
{
// 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 ...
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();
m_ctrlComm2.SetPortOpen(true); // Open COM2
else
{
//做一些处理,比如MessageBox("串口2已被占用");
return ;
}
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_ctrlComm.SetOutput(COleVariant(m_strEditTXDATA)); // send data
}发送的数据,比如:123, 到另外一个串口接收后,则是:0x31,0x32,0x33 。
如何实现发送的数据由现在的字符型,改成 16 进制的发送呢?thanks ...
{
// 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 ...
各位大哥大姐,我还是刚开始学用 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 ...
m_ctlBox.GetWindowText(s);s就是选的值
CIPAddressCtrl* pIP = (CIPAddressCtrl *)GetDlgItem(IDC_IP);
pIP->GetAddress(ip0, ip1, ip2, ip3);
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 ...
CString s = "10.110.116.53";
unsigned char a[4];
sscanf(s, "%d.%d.%d.%d", a, a+1, a+2, a+3);