现在的位置: 首页 > 综合 > 正文

控件串口编程

2018年04月17日 ⁄ 综合 ⁄ 共 1938字 ⁄ 字号 评论关闭

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足够接收完数据,且不会有延时感,数据也会连续了。

【上篇】
【下篇】

抱歉!评论已关闭.