《检测串口程序.doc》由会员分享,可在线阅读,更多相关《检测串口程序.doc(6页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流检测串口程序.精品文档.当我们在用VS进行串口编程时,在打开串口前,经常想知道当前PC上存在多少个串口,哪些串口可用?哪些串口已经打开了,最好是在一个Combo Box中列表系统当前所有可用的串口以供选择,然而如何获取系统当前可用的串口有哪些呢?这里介绍的方法也是最简单也是最笨的一种方法,即一个一个去试,试完了就知道了。至于还有没有其它更好的方法,暂不在本文所讨论的范围之内。一个在对话框的OnInitDialog函数内做如下操作:1 初始化时检测串口cpp view plaincopy1 BOOL Ctbox_debug_viewDlg:On
2、InitDialog() 2 CDialogEx:OnInitDialog(); 3 / Add About. menu item to system menu. 4 / IDM_ABOUTBOX must be in the system command range. 5 ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); 6 ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); 15 pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 16 /
3、 Set the icon for this dialog. The framework does this automatically 17 / when the applications main window is not a dialog 18 SetIcon(m_hIcon, TRUE); / Set big icon 19 SetIcon(m_hIcon, FALSE); / Set small icon 20 / TODO: Add extra initialization here 21 AddCom();/向组合框中添加串口设备 22 m_CombolPort.SetCurS
4、el(0); AddCom函数如下定义:cpp view plaincopy23 void Ctbox_debug_viewDlg:AddCom(void) 24 EnumerateSerialPorts(ports,portse,portsu); 25 unsigned short uicounter; 26 unsigned short uisetcom; 27 CString str; 28 /获取可用串口个数 29 uicounter = portse.GetSize(); 30 /如果个数大于0 31 if(uicounter 0) 32 /初始化串口列表框 33 for(int i
5、=0; iuicounter; i+) 34 uisetcom = portse.ElementAt(i); 35 str.Format(_T(COM%d ),uisetcom); 36 m_CombolPort.AddString(str); EnumerateSerialPorts函数如下:cpp view plaincopy37 void Ctbox_debug_viewDlg:EnumerateSerialPorts(CUIntArray& ports, CUIntArray& portse, CUIntArray& portsu) 38 /清除串口数组内容 39 ports.Remo
6、veAll(); 40 portse.RemoveAll(); 41 portsu.RemoveAll(); 42 /因为至多有255个串口,所以依次检查各串口是否存在 43 /如果能打开某一串口,或打开串口不成功,但返回的是 ERROR_ACCESS_DENIED错误信息, 44 /都认为串口存在,只不过后者表明串口已经被占用 45 /否则串口不存在 46 for (int i=1; iSetWindowText(_T(打开); 72 ShowInfo(_T(关闭串口成功!); 73 m_OpenStatus =false; 74 return; 75 UpdateData(TRUE); 7
7、6 m_OpenStatus =true; 77 /当前端口号 78 int curPort =portse.ElementAt(m_CombolPort.GetCurSel(); 79 m_mscomm.put_CommPort(curPort);/端口号 80 m_mscomm.put_InBufferSize(1024);/接收缓冲区 81 m_mscomm.put_OutBufferSize(1024);/发送缓冲区 82 m_mscomm.put_InputLen(0);/设置当前接收区数据长度为0,表示全部读取 83 m_mscomm.put_InputMode(1);/以二进制方
8、式读写数据 84 m_mscomm.put_RThreshold(1);/接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件 85 /波特率 86 DWORD baudrate; 87 switch(m_CombolBaudrate.GetCurSel() 88 case 0: 89 baudrate =115200; 90 break; 91 case 1: 92 baudrate =9600; 93 break; 94 default: 95 ASSERT(FALSE); 96 break; 97 CString setting; 98 setting.Format(_T(
9、%d,n,8,1),baudrate); 99 m_mscomm.put_Settings(setting/*_T(115200,n,8,1)*/);/波特率,无校验,8个数据位,1个停止1位 100 m_mscomm.put_PortOpen(TRUE);/打开串口 101 GetDlgItem(IDC_BT_OPEN)-SetWindowText(_T(关闭); 102 ShowInfo(_T(打开串口成功!); 3 串口热拔插时检测串口这里主要利用Cwnd的ON_WM_DEVICECHANGE消息来处理。ON_WM_DEVICECHANGE消息在VS2010中好像只能通过手动来添加,反正
10、我没找到可以通过对话的形式来添加的,后续有知道的兄台麻烦告知我一下。因此,首先得手动添加ON_WM_DEVICECHANGE消息:第一步:在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg, CDialogEx)中添加:cpp view plaincopy103 ON_WM_DEVICECHANGE() 第二步:在头文件类的定义中添加函数声明:cpp view plaincopy104 afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData); 第三步:实现函数cpp view plaincopy10
11、5 BOOL Ctbox_debug_viewDlg:OnDeviceChange(UINT nEventType,DWORD dwData) 106 /DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData; 107 switch (nEventType) 108 case DBT_DEVICEREMOVECOMPLETE:/移除设备 109 case DBT_DEVICEARRIVAL:/添加设备 110 RefreshCom();/刷新组合框的内容 111 break; 112 defaul
12、t: 113 break; 114 return TRUE; RefreshCom函数如下:cpp view plaincopy115 void Ctbox_debug_viewDlg:RefreshCom(void) 116 int count =m_CombolPort.GetCount(); 117 for(int i=0;icount;i+) 118 m_CombolPort.DeleteString(count -1 -i); 119 AddCom(); 120 m_CombolPort.SetCurSel(0); 第四步:在.cpp文件中包含头文件cpp view plaincop
13、y121 #include 这是因为DEV_BROADCAST_DEVICEINTERFACE,DBT_DEVICEREMOVECOMPLETE,DBT_DEVICEARRIVAL这几个东东在头文件Dbt.h中定义的,这样才能编译通过。而AddCom函数已经在之前讲到过,回过头去看看。这里的思想是通过检测到设备的插入和拔出时刷新组合框的内容,是通过重新测试串口的方式来实现的。另:需要注意的是,当插入和拔出设备时,系统会检测到两次设备改变事件,因此会两次调用OnDeviceChange函数,第一次调用时传入的函数nEventType的值固定为0x07,第二次调用时nEventType才是上述代码switch中所定义的事件,这与网上所说的需要注册是相悖的,不知道为什么网上有些文章会说一定需要注册什么的才能检测到设备改变的事件,反正我这里不需要,我用的是VS2010.完!
限制150内