利用vc++中的MSComm控件来进行串口的编程,方便快捷。c++
- BOOL CSCommTestDlg::OnInitDialog()
- {
- CDialog::OnInitDialog();
- 。。。
- if(m_ctrlComm.GetPortOpen())
- m_ctrlComm.SetPortOpen(FALSE);
- m_ctrlComm.SetCommPort(1); //选择com1
- if(!m_ctrlComm.GetPortOpen())
- m_ctrlComm.SetPortOpen(TRUE);//打开串口
- else
- AfxMessageBox("cannot open serial port");
- m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个中止位
- m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
- m_ctrlComm.SetRThreshold(1);
- //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引起一个接收数据的OnComm事件
- m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
- m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
- return TRUE; // return TRUE unless you set the focus to a control
- }
- void CHDF_GUIDlg::OnOnCommMscomm1()
- {
- VARIANT variant_inp;
- COleSafeArray safearray_inp;
- static rxdata_len = 0;
- LONG len,k;
- BYTE rxdata[500]; //设置BYTE数组 An 8-bit integerthat is not signed.
- CString strtemp;
- if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
- { ////////如下你能够根据本身的通讯协议加入处理代码
- variant_inp=m_ctrlComm.GetInput(); //读缓冲区
- safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
- len=safearray_inp.GetOneDimSize(); //获得有效数据长度
- for(k=0;k<len;k++)
- safearray_inp.GetElement(&k,rxdata+k+rxdata_len);//转换为BYTE型数组
- rxdata_len+=len;
- for(k=rxdata_len-len;k<rxdata_len;k++) //将数组转换为Cstring型变量
- {
- strtemp.Format("%.2x",rxdata[k]); //将字符送入临时变量strtemp存放
- m_strRXData+=strtemp; //加入接收编辑框对应字符串
- }
- m_strRXData+="\r\n";
- UpdateData(FALSE); //更新编辑框内容
- //对数据进行处理,若是大于设定字符长度6,则先处理前6个字符再接着处理余下字符
- for(;rxdata_len>=6;) //只要数据缓冲区数据大于6个字节,则进行一次处理
- {
- if(0x58==rxdata[0]&&0x58!=rxdata[1]&&0x59==rxdata[5])//为真表示为数据开头
- {
- unsigned char ucdata[4]={rxdata[1],rxdata[2],rxdata[3],rxdata[4]};
- for(k=0;k<rxdata_len-6;k++)
- {
- rxdata[k]=rxdata[k+6];
- }
- rxdata_len-=6;
- ProcessData(ucdata);//对收到的一帧可用数据进行处理,更新各个状态寄存器 }
- else
- {
- for(k=0;k<rxdata_len-1;k++)
- {
- rxdata[k]=rxdata[k+1];
- }
- rxdata_len-=1;
- }
- }
- }
- }
5.发送数据(为发送按钮添加函数)编程
为发送按钮添加一个单击函数,既BN_CLICKED,打开创建类向导,选中IDC_BUTTON_MANUALSEND,双击BN_CLICKED添加OnButtonManualsend( )函数,代码以下:数组
- void CSCommTestDlg::OnButtonManualsend()
- {
- // TODO: Add your control notification handler code here
- UpdateData(TRUE); //读取编辑框内容
- m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据
- }
6.串口调试less
下载运行VSPM虚拟串口v2.65,一切按默认进行,运行后COM3和COM4串口相连。将本身的vc程序改为控制串口COM3。运行串口调试助手v2.2,选择串口COM4,调试串口之间的通讯。ide