VC串口编程

记性不好,权当记录

// AllocConsole();//打开控制台

// FreeConsole();
// freopen("CONOUT$","w+t",stdout); 
// freopen("CONIN$","r+t",stdin); 
//GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);


//CWnd* pWnd = GetDlgItem(IDC_STATIC);
//CString str;
//pWnd->GetWindowText(str);
//str += localIP;

//pWnd->SetWindowText(str);

//CString port;

//pWnd->GetWindowText(port);

//m_ctrlComm.SetInputModel(atoi(port.GetBuffer(0)));



1、利用ClassWizard定义CMSComm类控制对象
  打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() #i nclude "mscomm.h" //}}AFX_INCLUDES 。


2、在对话框中添加控件
    向主对话框中添加两个编辑框,一个用于接收显示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。
  再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类, 为IDC_EDIT_RXDATA添加CString变量m_strRXData, 为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。


3、添加串口事件消息处理函数OnComm()
  打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,
  这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码:
 
void CSCommTestDlg::OnComm()   
{  
    // TODO: Add your control notification handler code here  
    VARIANT variant_inp;  
    COleSafeArray safearray_inp;  
    LONG len,k;  
    BYTE rxdata[2048]; //设置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;
        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); 
            strtemp.Format("%c",bt); 
            m_strRXData+=strtemp; //加入接收编辑框对应字符串   
        }  
    }  
    UpdateData(FALSE);   
}  


3、打开串口和设置串口参数


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");
 
m_ctrlComm.SetInputModel(1); //1:表示以二进制方式检取数据  
m_ctrlComm.SetRThreshold(1);   
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0  
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据  
 


4、发送数据
 
void CSCommTestDlg::OnButtonsend()   
{  
// TODO: Add your control notification handler code here  
  UpdateData(TRUE); //读取编辑框内容  

  m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据  

// CByteArray bytes; //二进制
// bytes.Add( 0x30 );
// m_ctrlComm.SetOutput(COleVariant(bytes));//发送数据

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