控件串口编程

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

 

 

你可能感兴趣的:(编程)