码迷,mamicode.com
首页 > 其他好文 > 详细

vc mscomm串口通信使用了CButtonST按钮类软件分析

时间:2015-12-29 14:22:04      阅读:266      评论:0      收藏:0      [点我收藏+]

标签:

使用了mscomm串口控件,使用了CButtonST按钮类,使用静态文本框实现了系统时间的显示控件,引入按钮文件BtnST.cpp

技术分享

 

主对话框

// CDoorControlDlg dialog

CDoorControlDlg::CDoorControlDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CDoorControlDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CDoorControlDlg)
    m_receive = _T("");//接收的字符串
    m_send = _T("");//发送的字符串
    m_check_autoS = FALSE;//自动发送
    m_check_hexS = FALSE;//十六进制发送
    m_check_hexR = FALSE;//十六进展接收
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    m_bcomonoff=FALSE;//串口状态标志位串口处于关闭状态
}

主对话框初始化函数中;    

启动定时器,按钮图标和颜色设置,串口状态图标资源引入,设置主对话框显示的标题,

给组合框控件添加串口号,选择默认串口号。

// TODO: Add extra initialization here
    SetTimer(1,10,NULL);
    //按钮的设置
    m_btn_com.SubclassDlgItem(IDC_BTN_ONOFF,this);
    m_btn_com.SetIcon(IDI_ICON_COMOF);//图标
//    m_btn_com.SetFlat(FALSE);
    m_btn_com.SetColor(CButtonST::BTNST_COLOR_BK_OUT, RGB(208,100,208)); //颜色
    m_btn_com.SetColor(CButtonST::BTNST_COLOR_BK_FOCUS, RGB(208,208,208));
    m_btn_com.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 10);
    //串口状态图标
    m_hIcon_comon  = AfxGetApp()->LoadIcon(IDI_ICON_COMLEDON); //串口指示灯打开状态图标的设置
    m_hIcon_comoff = AfxGetApp()->LoadIcon(IDI_ICON_COMLEDOFF);//关闭状态图标
    m_ctrlIconOpenoff.SetIcon(m_hIcon_comoff);//串口指示灯初始状态为关闭
    //设置主对话框窗口标题
    SetWindowText("电梯门禁系统上位机!");
    //串口号选择的组合框设置
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM1");//串口号选择复选框的设置
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM2");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM3");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM4");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM5");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM6");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM7");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM8");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM9");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM10");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM11");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM12");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM13");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM14");
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->AddString("COM15");
    
    ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(0);//选择默认的COMM0口
    
    
    UpdateData(FALSE); //更新屏幕显示

    return TRUE;  // return TRUE  unless you set the focus to a control
}

 

打开关闭串口按钮

技术分享

 

//打开关闭串口按钮
void CDoorControlDlg::OnBtnOnoff() 
{
    
/*    m_mscom.SetCommPort(3); //串口1
    m_mscom.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes 
    m_mscom.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes 
    if(!m_mscom.GetPortOpen()) //打开串口
    {
        m_mscom.SetPortOpen(true); 
    }
    m_mscom.SetInputMode(1); //设置输入方式为二进制方式 
    m_mscom.SetSettings("9600,n,8,1"); //设置波特率等参数 
    m_mscom.SetRThreshold(1); //为1表示有一个字符即引发事件 
    m_mscom.SetInputLen(0);
*/
    // TODO: Add your control notification handler code here
    if(!m_bcomonoff)    //第一次点击,打开串口
    {
        if(m_mscom.GetPortOpen())
        {
            AfxMessageBox("该端口已经被打开或者被占用!");
        }
        int ComSel;
        ComSel=((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCurSel();//串口号索引值
        
        m_mscom.SetCommPort(ComSel+1);    //选择串口号
        m_mscom.SetInputMode(1);//设置输入方式为二进制方式 
        m_mscom.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytes
        m_mscom.SetOutBufferSize(512);//设置输出缓冲区的大小,Bytes
        m_mscom.SetSettings("9600,n,8,1"); //设置波特率等参数 
        if(!m_mscom.GetPortOpen())
            m_mscom.SetPortOpen(TRUE);
        else
        {
            AfxMessageBox("该端口已经被打开或者被占用!");
        }
        m_mscom.SetRThreshold(1);//为1表示有一个字符即引发事件
        m_mscom.SetInputLen(0);
        m_mscom.GetInput();
        
        EableSetting(FALSE);//使能组合框设置
        m_ctrlIconOpenoff.SetIcon(m_hIcon_comon);//设置串口打开图标
        ((CButton *)GetDlgItem(IDC_BTN_ONOFF))->SetWindowText("关闭串口");//设置按钮控件文本内容
        m_bcomonoff=TRUE;//串口打开标志位
    }
    else if(m_bcomonoff)    //第2次点击,关闭串口
    {
        int ComSel;
        ComSel=((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCurSel();
        m_mscom.SetPortOpen(FALSE);
        
        EableSetting(TRUE);
        m_ctrlIconOpenoff.SetIcon(m_hIcon_comoff);
        ((CButton *)GetDlgItem(IDC_BTN_ONOFF))->SetWindowText("打开串口");
        m_bcomonoff=FALSE;
    }
}

串口组合框使能

//串口组合框使能
void CDoorControlDlg::EableSetting(BOOL able)
{
    GetDlgItem(IDC_COMBO1)->EnableWindow(able);  //串口组合框使能
    UpdateData(FALSE);      //更新屏幕显示
}

串口控件,接收触发函数:

BEGIN_EVENTSINK_MAP(CDoorControlDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CDoorControlDlg)
    ON_EVENT(CDoorControlDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
    //}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

接收函数:

 

void CDoorControlDlg::OnOnCommMscomm1() 
{
    // TODO: Add your control notification handler code here
    UpdateData(true);
    
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    
    long i = 0;
    int len;
    char rxdata[1000];
    CString tmp;
    switch (m_mscom.GetCommEvent())
    {
        case 2://表示接收缓冲区内有字符
        {
            variant_inp = m_mscom.GetInput();
            safearray_inp = variant_inp;
            len = safearray_inp.GetOneDimSize();
            for (i = 0; i < len; i++)
            {
                safearray_inp.GetElement(&i, &rxdata[i]);//转换为BYTE型数组 
            }
            for(i=0;i<len;i++)             //将数组转换为Cstring型变量
            {
                BYTE bt=*(char*)(rxdata+i);      //字符型
                
                if(m_check_hexR)
                {
                    tmp.Format("%X ",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
                    m_receive+=tmp;
                }
                else 
                    tmp.Format("%c",bt); //将字符送入临时变量strtemp存放
            }
            rxdata[i] = \0;
        }
        if(!m_check_hexR)
            m_receive +=rxdata;

        UpdateData(false);
            break;
    default:
            break;
    }

}

发送函数:

//发送数据到串口
void CDoorControlDlg::OnBtnSend() 
{
    // TODO: Add your control notification handler code here
    UpdateData(true);
    CByteArray sendArr; 
    WORD wLength;
    CByteArray hexdata;

    wLength = m_send.GetLength();
    sendArr.SetSize(wLength);
    for(int i =0; i<wLength; i++)
    {
        sendArr.SetAt(i, m_send.GetAt(i));
    }
    if(m_check_hexS)
    {
        
        int len=String2Hex(m_send,hexdata);
        m_mscom.SetOutput(COleVariant(hexdata));
    }
    else
        m_mscom.SetOutput(COleVariant(sendArr));

}

清除接收和发送文本框内容、

void CDoorControlDlg::OnBtnSendclr() 
{
    // TODO: Add your control notification handler code here
    m_send="";
    UpdateData(false);
}

void CDoorControlDlg::OnBtnRececlr() 
{
    // TODO: Add your control notification handler code here
    m_receive="";
    UpdateData(false);
}

定时器函数:  系统时间获取显示,时间显示静态文本框的背景色设置,文本色设置,

void CDoorControlDlg::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default
    CTime time=CTime::GetCurrentTime();//获取时间
    int nHour=time.GetHour();
    int nMinute=time.GetMinute();
    int nSecond=time.GetSecond();
    
    m_digital_clock.SetBkColor(RGB(250,200,100)); //设置时间背景色
    m_digital_clock.SetTextColor(RGB(0,0,255));
    m_digital_clock.SetClock(nHour,nMinute,nSecond);
    CDialog::OnTimer(nIDEvent);
}

 

字符串转换:

 

int CDoorControlDlg::String2Hex(CString str, CByteArray &senddata)
{
    int hexdata,lowhexdata;
    int hexdatalen=0;
    int len=str.GetLength();
    
    senddata.SetSize(len/2);
    
    for(int i=0;i<len;)
    {
        char lstr,hstr=str[i];
        if(hstr== )
        {
            i++;
            continue;
        }
        i++;
        if(i>=len)
            break;
        lstr=str[i];
        hexdata=ConvertHexChar(hstr);
        lowhexdata=ConvertHexChar(lstr);
        if((hexdata==16)||(lowhexdata==16))
            break;
        else 
            hexdata=hexdata*16+lowhexdata;
        i++;
        senddata[hexdatalen]=(char)hexdata;
        hexdatalen++;
    }
    
    senddata.SetSize(hexdatalen);
    return hexdatalen;

}

十六进制:

 

char CDoorControlDlg::ConvertHexChar(char ch)
{
    //这是一个将字符转换为相应的十六进制值的函数
    //功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1

    if((ch>=0)&&(ch<=9))
        return ch-0x30;
    else if((ch>=A)&&(ch<=F))
        return ch-A+10;
    else if((ch>=a)&&(ch<=f))
        return ch-a+10;
    else return (-1);


}

 

vc mscomm串口通信使用了CButtonST按钮类软件分析

标签:

原文地址:http://www.cnblogs.com/rechen/p/5085377.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!