我心永恒了啊 我心永恒了啊
关注数: 0 粉丝数: 2 发帖数: 305 关注贴吧数: 39
VS2010 基于mscomm控件的串口通信 不能接受 求大神赐教:本人小白一名,第一次接触VS2010,照着别人的代码稍微改动了下,实现最基本的串口通信(按钮3个:打开串口,关闭串口,发送;编辑框2个:发送框,接收框),发现可以发送,但是不能显示在接收框中。以下是全部添加的代码: void CcommtestDlg::OnBnClickedButtonOpen() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_CommPort(3); //set com3 m_mscomm.put_Settings("9600,n,8,1");//设置串口波特率9600,无校验,8位数据,1个停止位, m_mscomm.put_InBufferSize(1024); //设置输入缓冲区大小 m_mscomm.put_OutBufferSize(1024);//设置输出缓冲区大小 m_mscomm.put_InputMode(1);//选择发送形式为二进制 m_mscomm.put_RThreshold(1);//当串口输入缓冲区有一个或者一个以上字符时激发ONCOMM事件转入ONCOMm事件处理程序 if(m_mscomm.get_PortOpen()) //检查串口状态,如果是打开的就把它关掉 { m_mscomm.put_PortOpen(FALSE); } if(!m_mscomm.get_PortOpen()) { m_mscomm.put_PortOpen(TRUE); m_mscomm.put_InputLen(0); //读取缓冲区全部内容 m_mscomm.get_Input();//预读,清空缓冲区 AfxMessageBox(_T("the com3 is ready")); } else { m_mscomm.put_OutBufferCount(0); AfxMessageBox(_T("the com3 is error")); } } void CcommtestDlg::OnBnClickedButtonClose() { // TODO: 在此添加控件通知处理程序代码 m_mscomm.put_PortOpen(FALSE);//关闭串口 AfxMessageBox(_T("the com3 is close")); } void CcommtestDlg::OnBnClickedButtonSend() { // TODO: 在此添加控件通知处理程序代码 UpdateData(true); char TxData[100]; int Count = m_EditSend.GetLength(); for(int i = 0; i < Count; i++) TxData[i] = m_EditSend.GetAt(i); CByteArray array; array.RemoveAll(); array.SetSize(Count+2); for(int i = 0; i < Count; i++) array.SetAt(i, TxData[i]); array.SetAt(Count, '\r'); //在发送的字符后加入\r\n array.SetAt(Count+1, '\n'); m_mscomm.put_Output(COleVariant(array)); m_EditSend.Empty();//清空编辑框 UpdateData(false);//更新编辑框内容 } BEGIN_EVENTSINK_MAP(CcommtestDlg, CDialogEx) ON_EVENT(CcommtestDlg, IDC_MSCOMM1, 1, CcommtestDlg::OnCommMscomm1, VTS_NONE) END_EVENTSINK_MAP() void CcommtestDlg::OnCommMscomm1() { // TODO: 在此处添加消息处理程序代码 static unsigned int cnt=0; VARIANT variant_inp;//计算机底层传回的是VARIANT数据类型 COleSafeArray safearray_inp;//由VARIANT派生的一种数据类型继承了VARIANT的特性 long len,k; BYTE rxdata[1024]; //定义BYTE数组大小作用类似于单片机的数据缓存区SBUF CString strtemp; //定义CString变量 if(m_mscomm.get_CommEvent ()==2 )//值为2时骸表括示接收缓冲区存在有效字符 { cnt++; variant_inp=m_mscomm.get_Input();//读取缓冲区消息, 取得缓冲区所有内容赋给VARRINT型í变量variant_inp safearray_inp=variant_inp;//变量转换 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("%02X",bt); //将字符送入临时变量strtemp存放 m_EditReseive+=strtemp; //加入对应字符串data中 CString temp="\r\n"; //换行 m_EditReseive+=temp; } } UpdateData(FALSE); }
1 下一页