标签:
使用了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