1.添加控件
通过菜单Project→Add to Project→Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
2.在窗口上添加一个串口控件,随便放一个位置,此控件是不可见的。
3.为控件添加变量m_com为后面操作做准备,如果不添加变量也可以用GetDlgItem函数获取句柄进行操作
4.打开串口
先获取串口是否打开,如果打开了就先关闭,可以避免和其他的串口软件冲突。也可以随时更改串口设备,比如更改波特率等
if (m_com.GetPortOpen()) { m_com.SetPortOpen(0); }
m_com.SetCommPort(nUart); //设置端口 char SetStr[255] = {0}; wsprintf(SetStr,"%d,N,8,1",nBaud); m_com.SetSettings(SetStr); //设置波特率,校验位,停止位 m_com.SetInBufferSize(1024); //设置缓冲大小 m_com.SetInBufferCount(0); //清空接收缓冲区 m_com.SetInputMode(1); //设置以二进制方式读写数据 m_com.SetInputLen(0); //设置设置当前接收区数据长度为0,表示全部读取 m_com.SetRThreshold(1); //接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件 m_com.SetPortOpen(1); //打开串口
经上面的步骤即可打开串口。
5.发送数据
控件串口发送数据非常方便,使用API即可
m_com.GetInput();//先预读缓冲区以清除残留数据 m_com.SetOutput(COleVariant(str));
COleVariant是一个宏,必须加上它,否则编译报错。str就是一个普通的字符串
6.接收数据
接收数据可以用控件自身的消息机制,双击串口控件可以为它添加事件响应函数
void CBluetooth_AT_TestDlg::OnOnCommCommctrl()
每当有数据发送或者接收时串口的缓冲区都会有变化,上面事件就是监控这个变化
UpdateData(); VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_com.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { variant_inp = m_com.GetInput(); //读缓冲区 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); //字符型 if(m_hex == TRUE) //接收字符的显示方式 strtemp.Format("%02X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔 else strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strReceive = m_strReceive + strtemp; //加入接收编辑框对应字符串 } }
事件2表示有数据被接收到,因为串口是每接收到一个字符就会处理一次,要是添加到ListBox中就会出现一个字符一行的尴尬局面,所以先放在一个CString中,在程序初始化中开启一个定时器
//启动定时器 SetTimer(1,100,0);
每过0.1s程序进入定时器事件中一次,在里面将信息取出来
void CBluetooth_AT_TestDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default //KillTimer(1); if(m_strReceive!="") { m_list.AddString (m_strReceive); //更新内容 m_strReceive = ""; } CDialog::OnTimer(nIDEvent); }
0.1s足够接收完数据,且不会有延时感,数据也会连续了。