• 控件串口编程


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

  • 相关阅读:
    has already been called for this response
    Mysql Innodb的两种表空间方式
    针对MyISAM表锁的解决方案
    MySQL数据库表修复--MyISAM
    如何修复损坏的MySQL数据表[转]
    MySQL大量unauthenticated user
    Linux基本命令篇 进程管理
    Linux 知识点滴
    Linux基本命令篇 用户管理
    Linux基本命令篇 文件管理
  • 原文地址:https://www.cnblogs.com/riskyer/p/3320278.html
Copyright © 2020-2023  润新知