首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于VS2010与mscomm控件的怨念,

2012-03-05 
关于VS2010与mscomm控件的怨念,紧急求助。。我在用vs2010做一个和串口通讯有关的项目(刚刚接触串口通讯和201

关于VS2010与mscomm控件的怨念,紧急求助。。
我在用vs2010做一个和串口通讯有关的项目(刚刚接触串口通讯和2010),但是网上书上的关于mscomm控件的资料基本都是VC6.0的……现在我的情况是编译无错,程序也能跑得起来,包括串口的初始化部分和端口打开都正确,可是就是读不了数据(我在想是不是响应函数没有触发??)蛋疼哎蛋疼。。

所以我把我的操作过程写出来,请诸位大侠看看哪里出了错。

开始找那个控件就搞得我很尴尬,要从tools里面choose Toolbox Items里面,IDC_MSCOMM1。导入之后添加了个变量m_comm和消息响应函数OnMscomm1。所在视图的初始化函数OnInitialUpdate和OnMscomm1如下:

C/C++ code
void CControlDisplayView::OnInitialUpdate(){    CFormView::OnInitialUpdate();    // TODO: Add your specialized code here and/or call the base class    // TODO:  Add your specialized creation code here    m_comm.put_CommPort(1);  //选择COM1    m_comm.put_InputMode(1); //输入方式为二进制方式    m_comm.put_InBufferSize(1024); //设置输入缓冲区大小    m_comm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件    m_comm.put_SThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件    m_comm.put_Settings(_T("9600,n,8,1"));     m_comm.get_PortOpen();//打开串口    m_rec=167.0;    UpdateData(false);    /*CButton* m_button = (CButton*)GetDlgItem(IDC_RADIO1);//默认选择单选按钮1    m_button->SetCheck(TRUE);    choosenum=1;    GetDlgItem(IDC_BUTTON2)->EnableWindow(false);//设置开始按钮无效    GetDlgItem(IDC_BUTTON3)->EnableWindow(false);//设置停止按钮无效    GetDlgItem(IDC_BUTTON4)->EnableWindow(false);//设置打开按钮无效    GetDlgItem(IDC_BUTTON5)->EnableWindow(false);//设置关闭按钮无效        m_receive="Hello";    UpdateData(FALSE);  //更新编辑框内容*/}void CControlDisplayView::OnMscomm1(){    // TODO: Add your command handler code here    VARIANT variant_inp;    COleSafeArray safearray_inp;    LONG len,k;    BYTE rxdata[512]; //设置BYTE数组    CString strtemp;    CString data;    UpdateData(true);    m_rec=float(678.08);//为了测试用的,可是一直看不到他执行--0蛋疼哎……    UpdateData(false);        if(2==m_comm.get_CommEvent()) //事件值为2表示接收缓冲区内有字符    {        variant_inp=m_comm.get_Input(); //读缓冲区        safearray_inp=variant_inp;  //VARIANT型变量转换为ColeSafeArray型变量        len=safearray_inp.GetOneDimSize(); //得到有效数据长度        for(k=0;k<len;k++)            safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组        for(k=0;k<len;k++)             //将数组转换为Cstring型变量        {            BYTE bt=*(char*)(rxdata+k);    //字符型            strtemp.Format(_T("%02X"),bt);    //将字符送入临时变量strtemp存放            data+=strtemp;  //加入对应字符串data中            }        //m_rec=float(atof((char*)LPCTSTR(data)));        UpdateData(false);    }}


接下来,在头文件中定义了
DECLARE_EVENTSINK_MAP();
在cpp文件中做了:

BEGIN_EVENTSINK_MAP(CControlDisplayView, CFormView) 
//{{AFX_EVENTSINK_MAP(COLECommView) 
ON_EVENT(CControlDisplayView, IDC_MSCOMM1, 1 /* OnComm */, OnMscomm1, VTS_NONE) 
//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP()

就这样了,我不知道还要做什么了,因为书上好像就这样就可以了。。是不是我程序写错了啊?还有,无论我怎么弄,添加控件之后,我在classwizard里面的是看不到IDC_MSCOMM1这个控件和他关联的变量的!!!!为神马呀为神马,我对vs2010怨念深重。。。小弟十分苦恼,望诸位大哥不吝赐教!!!

[解决办法]
和VC6的差不多啊
会不会是你mscomm32.ocx没注册,

用regsvr32 mscomm32.ocx注册一下

[解决办法]
没有用过2010!
是不是你手动修改了什么?
要不,你将clw文件删除后,重新创建看看?
[解决办法]
不知道回复的是不是太晚了。
可能是用vs2010开发MFC的人很少。
哥们,不用类向导关联变量,直接用鼠标右键点击com控件,选择“添加变量”
具体的函数和vc6.0不大一样
if(this->COM.get_PortOpen())
{

this->COM.put_PortOpen(FALSE);
}

this->COM.put__CommPort(1);
if(!this->COM.get_PortOpen())
{
this->COM.put_PortOpen(TRUE);

}
else
{
MessageBox("不能打开串口");
}

this->COM.put_Settings("9600,n,8,1");
this->COM.put_InputMode(1);
this->COM.get_Input();


this->COM.put_InputLen(0);
this->COM.put_RThreshold(1);

//发送指令
this->COM.put_Output(COleVariant("发送内容"));
[解决办法]
那样添加控件非常不好...建议直接从项目里生成一个MCSomm的类。作为初学者今天找添加这个控件的方法快找了一下午了

热点排行