关于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的类。作为初学者今天找添加这个控件的方法快找了一下午了