




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选文档当我们在用VS进行串口编程时,在打开串口前,经常想知道当前PC上存在多少个串口,哪些串口可用?哪些串口已经打开了,最好是在一个Combo Box中列表系统当前全部可用的串口以供选择,然而如何猎取系统当前可用的串口有哪些呢? 这里介绍的方法也是最简洁也是最笨的一种方法,即一个一个去试,试完了就知道了。至于还有没有其它更好的方法,暂不在本文所争辩的范围之内。一个在对话框的OnInitDialog函数内做如下操作:1 初始化时检测串口cpp view plaincopy1 BOOL Ctbox_debug_viewDlg:OnInitDialog() 2 3 CDialogEx:OnInit
2、Dialog(); 4 5 / Add "About." menu item to system menu. 6 7 / IDM_ABOUTBOX must be in the system command range. 8 ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); 9 ASSERT(IDM_ABOUTBOX < 0xF000); 10 11 CMenu* pSysMenu = GetSystemMenu(FALSE); 12 if (pSysMenu != NULL) 13 14 BOOL bNameVal
3、id; 15 CString strAboutMenu; 16 bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); 17 ASSERT(bNameValid); 18 if (!strAboutMenu.IsEmpty() 19 20 pSysMenu->AppendMenu(MF_SEPARATOR); 21 pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 22 23 24 25 / Set the icon for this dialog. The fr
4、amework does this automatically 26 / when the application's main window is not a dialog 27 SetIcon(m_hIcon, TRUE); / Set big icon 28 SetIcon(m_hIcon, FALSE); / Set small icon 29 30 / TODO: Add extra initialization here 31 32 AddCom();/向组合框中添加串口设备 33 m_CombolPort.SetCurSel(0); 34 /. 35 AddCom函数如下
5、定义:cpp view plaincopy36 void Ctbox_debug_viewDlg:AddCom(void) 37 38 EnumerateSerialPorts(ports,portse,portsu); 39 unsigned short uicounter; 40 unsigned short uisetcom; 41 CString str; 42 43 /猎取可用串口个数 44 uicounter = portse.GetSize(); 45 /假如个数大于0 46 if(uicounter > 0) 47 48 /初始化串口列表框 49 for(int i=0;
6、 i<uicounter; i+) 50 51 uisetcom = portse.ElementAt(i); 52 str.Format(_T("COM%d "),uisetcom); 53 m_CombolPort.AddString(str); 54 55 56 EnumerateSerialPorts函数如下:cpp view plaincopy57 void Ctbox_debug_viewDlg:EnumerateSerialPorts(CUIntArray& ports, CUIntArray& portse, CUIntArray&am
7、p; portsu) 58 59 /清除串口数组内容 60 ports.RemoveAll(); 61 portse.RemoveAll(); 62 portsu.RemoveAll(); 63 /由于至多有255个串口,所以依次检查各串口是否存在 64 /假如能打开某一串口,或打开串口不成功,但返回的是 ERROR_ACCESS_DENIED错误信息, 65 /都认为串口存在,只不过后者表明串口已经被占用 66 /否则串口不存在 67 for (int i=1; i<256; i+) 68 69 /Form the Raw device name 70 CString sPort; 7
8、1 sPort.Format(_T(".COM%d"), i); 72 73 /Try to open the port 74 BOOL bSuccess = FALSE; 75 HANDLE hPort = :CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0); 76 if (hPort = INVALID_HANDLE_VALUE) 77 78 DWORD dwError = GetLastError(); 79 80 if (dwError = ERROR_ACCESS_
9、DENIED) 81 82 bSuccess = TRUE; 83 portsu.Add(i); /已占用的串口 84 85 86 else 87 88 /The port was opened successfully 89 bSuccess = TRUE; 90 portse.Add(i); /可用的串口 91 /Don't forget to close the port, since we are going to do nothing with it anyway 92 CloseHandle(hPort); 93 94 95 /Add the port number to
10、the array which will be returned 96 if (bSuccess) 97 ports.Add(i); /全部存在的串口 98 99 如上操作即可将系统当前可用的全部串口添加到CombolPort所对应的Combol Box中了。 2 打开串口代码如下:cpp view plaincopy100 void Ctbox_debug_viewDlg:OnBnClickedBtOpen() 101 102 / TODO: Add your control notification handler code here 103 104 if(m_mscomm.get_Por
11、tOpen() 105 106 m_mscomm.put_PortOpen(FALSE); 107 GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("打开"); 108 ShowInfo(_T("关闭串口成功!"); 109 m_OpenStatus =false; 110 return; 111 112 UpdateData(TRUE); 113 m_OpenStatus =true; 114 /当前端口号 115 int curPort =portse.ElementAt(m_CombolPort.GetCu
12、rSel(); 116 m_mscomm.put_CommPort(curPort);/端口号 117 m_mscomm.put_InBufferSize(1024);/接收缓冲区 118 m_mscomm.put_OutBufferSize(1024);/发送缓冲区 119 120 m_mscomm.put_InputLen(0);/设置当前接收区数据长度为0,表示全部读取 121 m_mscomm.put_InputMode(1);/以二进制方式读写数据 122 m_mscomm.put_RThreshold(1);/接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm大事 12
13、3 124 125 126 /波特率 127 DWORD baudrate; 128 switch(m_CombolBaudrate.GetCurSel() 129 130 case 0: 131 baudrate =115200; 132 break; 133 case 1: 134 baudrate =9600; 135 break; 136 default: 137 ASSERT(FALSE); 138 break; 139 140 CString setting; 141 setting.Format(_T("%d,n,8,1"),baudrate); 142 m_
14、mscomm.put_Settings(setting/*_T("115200,n,8,1")*/);/波特率,无校验,8个数据位,1个停止1位 143 144 m_mscomm.put_PortOpen(TRUE);/打开串口 145 GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("关闭"); 146 ShowInfo(_T("打开串口成功!"); 147 148 3 串口热拔插时检测串口这里主要利用Cwnd的ON_WM_DEVICECHANGE消息来处理。ON_WM_DEVICECHAN
15、GE消息在VS2010中好像只能通过手动来添加,反正我没找到可以通过对话的形式来添加的,后续有知道的兄台麻烦告知我一下。因此,首先得手动添加ON_WM_DEVICECHANGE消息:第一步:在消息映射BEGIN_MESSAGE_MAP(Ctbox_debug_viewDlg, CDialogEx)中添加:cpp view plaincopy149 ON_WM_DEVICECHANGE() 其次步:在头文件类的定义中添加函数声明:cpp view plaincopy150 afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData); 第三
16、步:实现函数cpp view plaincopy151 BOOL Ctbox_debug_viewDlg:OnDeviceChange(UINT nEventType,DWORD dwData) 152 153 /DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData; 154 switch (nEventType) 155 156 case DBT_DEVICEREMOVECOMPLETE:/移除设备 157 case DBT_DEVICEARRIVAL:/添加设备 158 RefreshCom
17、();/刷新组合框的内容 159 break; 160 161 default: 162 break; 163 164 165 return TRUE; 166 167 RefreshCom函数如下:cpp view plaincopy168 void Ctbox_debug_viewDlg:RefreshCom(void) 169 170 int count =m_CombolPort.GetCount(); 171 172 for(int i=0;i<count;i+) 173 174 m_CombolPort.DeleteString(count -1 -i); 175 176 AddCom(); 177 m_CombolPort.SetCurSel(0); 178 第四步:在.cpp文件中包含头文件cpp view plaincopy179 #include <Dbt.h> 这是由于DEV_BROADCAST_DEVICEINTERFACE,DBT_DEVICEREMOVECOMPLETE,DBT_DEVICEARRIVAL这几个东东在头文件Dbt.h中定义的,这样才能编译通过。 而AddC
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陕西邮电职业技术学院《都市型现代农业概论》2023-2024学年第二学期期末试卷
- 山西大同大学《仪器分析(光谱)》2023-2024学年第二学期期末试卷
- 福建华南女子职业学院《案例分析》2023-2024学年第二学期期末试卷
- 贵州民族大学《工程训练(Ⅱ)B》2023-2024学年第二学期期末试卷
- 云南理工职业学院《数字制图学》2023-2024学年第二学期期末试卷
- 潍坊工商职业学院《通信线路工程及管理》2023-2024学年第二学期期末试卷
- 邢台应用技术职业学院《跳远》2023-2024学年第二学期期末试卷
- 中山大学《拳击》2023-2024学年第二学期期末试卷
- 广东汕头幼儿师范高等专科学校《商业空间策划与设计》2023-2024学年第二学期期末试卷
- 养鱼合作协议书范本(7篇)
- 《小型混凝土预制件标准化生产管理办法》
- 六年级上册英语教案-Culture 2 Going Green 第二课时 广东开心英语
- 警察叔叔是怎样破案的演示文稿课件
- 青年教师个人成长档案
- 2021译林版高中英语选择性必修三课文翻译
- 2022年华中科技大学博士研究生英语入学考试真题
- 《网店运营与管理》整本书电子教案全套教学教案
- 打印版 《固体物理教程》课后答案王矜奉
- CAD术语对照表
- 中考《红星照耀中国》各篇章练习题及答案(1-12)
- Q∕GDW 11612.43-2018 低压电力线高速载波通信互联互通技术规范 第4-3部分:应用层通信协议
评论
0/150
提交评论