概述
1.背景
原意是在开发多串口通信助手。无意之间产生个鬼点子,利用串口功能开发一个无需网络的即时聊天工具。实现方法很简单,但是一些好处让我青睐,最关键的一点是隐蔽性好,不用网络,更不担心产生记录。至于为何要在实验室用这个小东西,你懂得!!!
2.一步一步实现
1.布置窗口基本结构
2.头文件中定义变量、消息函数3.源文件中实现串口初始化、 事件处理 消息class CMSCommMultiPortDlg : public CDialog { // Construction public: CMSCommMultiPortDlg(CWnd* pParent = NULL); // standard constructor // Dialog Data //{{AFX_DATA(CMSCommMultiPortDlg) enum { IDD = IDD_MSCOMMMULTIPORT_DIALOG }; CString m_strEditCOM1RXData; CString m_strEditCOM1TXData; CString m_strEditCOM2TXData; CString m_strEditCOM2RXData; CMSComm m_ctrlMSCommCOM1; CMSComm m_ctrlMSCommCOM2; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMSCommMultiPortDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: HICON m_hIcon; // Generated message map functions //{{AFX_MSG(CMSCommMultiPortDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnButtonCom1send(); afx_msg void OnButtonCom2send(); afx_msg void OnCommCOM1(); afx_msg void OnCommCOM2(); DECLARE_EVENTSINK_MAP() //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_MSCOMMMULTIPORTDLG_H__FEFC79A6_5B50_11D8_870F_00E04C3F78CA__INCLUDED_)
BOOL CMSCommMultiPortDlg::OnInitDialog() { CDialog::OnInitDialog(); // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon ///初始化COM1/// m_ctrlMSCommCOM1.SetCommPort(1); //选择COM1 m_ctrlMSCommCOM1.SetInputMode(1); //输入方式为二进制方式 m_ctrlMSCommCOM1.SetInBufferSize(1024); //设置输入缓冲区大小 m_ctrlMSCommCOM1.SetOutBufferSize(512); //设置输出缓冲区大小 //波特率9600,无校验,8个数据位,1个停止位 m_ctrlMSCommCOM1.SetSettings("9600,n,8,1"); //参数1表示每当串口接收缓冲区中有多于 //或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlMSCommCOM1.SetRThreshold(1); if(!m_ctrlMSCommCOM1.GetPortOpen()) m_ctrlMSCommCOM1.SetPortOpen(TRUE);//打开串口 m_ctrlMSCommCOM1.SetInputLen(0); //设置当前接收区数据长度为0 m_ctrlMSCommCOM1.GetInput(); //先预读缓冲区以清除残留数据 ///初始化COM2/// m_ctrlMSCommCOM2.SetCommPort(2); //选择COM2 m_ctrlMSCommCOM2.SetInputMode(1); //输入方式为二进制方式 m_ctrlMSCommCOM2.SetInBufferSize(1024); //设置输入缓冲区大小 m_ctrlMSCommCOM2.SetOutBufferSize(512); //设置输出缓冲区大小 //波特率9600,无校验,8个数据位,1个停止位 m_ctrlMSCommCOM2.SetSettings("9600,n,8,1"); //参数1表示每当串口接收缓冲区中有多于 //或等于1个字符时将引发一个接收数据的OnComm事件 m_ctrlMSCommCOM2.SetRThreshold(1); if(!m_ctrlMSCommCOM2.GetPortOpen()) m_ctrlMSCommCOM2.SetPortOpen(TRUE);//打开串口 m_ctrlMSCommCOM2.SetInputLen(0); //设置当前接收区数据长度为0 m_ctrlMSCommCOM2.GetInput(); //先预读缓冲区以清除残留数据 return TRUE; // return TRUE unless you set the focus to a control }
void CMSCommMultiPortDlg::OnButtonCom1send() { // TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容 m_ctrlMSCommCOM1.SetOutput(COleVariant(m_strEditCOM1TXData));//发送数据 }
void CMSCommMultiPortDlg::OnButtonCom2send() { // TODO: Add your control notification handler code here UpdateData(TRUE); //读取编辑框内容 m_ctrlMSCommCOM2.SetOutput(COleVariant(m_strEditCOM2TXData));//发送数据 }
void CMSCommMultiPortDlg::OnCommCOM1() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 CString strtemp; if(m_ctrlMSCommCOM1.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrlMSCommCOM1.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); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strEditCOM1RXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容 }
void CMSCommMultiPortDlg::OnCommCOM2() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 CString strtemp; if(m_ctrlMSCommCOM2.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ctrlMSCommCOM2.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); //字符型 strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放 m_strEditCOM2RXData+=strtemp; //加入接收编辑框对应字符串 } } UpdateData(FALSE); //更新编辑框内容 }
3.结果展示
最后
以上就是柔弱飞鸟为你收集整理的我所构建的单线即时聊天工具1.背景2.一步一步实现3.结果展示的全部内容,希望文章能够帮你解决我所构建的单线即时聊天工具1.背景2.一步一步实现3.结果展示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复