Mscomm32 串口无效(Invalid port number),导致窗口初始化异常

使用Microsoft Communications Control, version 6.0 控件,在一个窗口的 OnInitDialog()中初始化控件并调用 if(!pMsComm->get_PortOpen() )//打开串口 语句,其中pMsComm为Microsoft Communications Control, version 6.0 控件关联变量。该语句在失败时会抛出一个异常,该异常在与被如下代码捕获,

RESULT AFXAPI AfxCallWndProc(CWnd* pWnd, HWND hWnd, UINT nMsg,
	WPARAM wParam = 0, LPARAM lParam = 0)
{
	_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
	MSG oldState = pThreadState->m_lastSentMsg;   // save for nesting
	pThreadState->m_lastSentMsg.hwnd = hWnd;
	pThreadState->m_lastSentMsg.message = nMsg;
	pThreadState->m_lastSentMsg.wParam = wParam;
	pThreadState->m_lastSentMsg.lParam = lParam;

#ifdef _DEBUG
	_AfxTraceMsg(_T("WndProc"), &pThreadState->m_lastSentMsg);
#endif

	// Catch exceptions thrown outside the scope of a callback
	// in debug builds and warn the user.
	LRESULT lResult;
	TRY
	{
#ifndef _AFX_NO_OCC_SUPPORT
		// special case for WM_DESTROY
		if ((nMsg == WM_DESTROY) && (pWnd->m_pCtrlCont != NULL))
			pWnd->m_pCtrlCont->OnUIActivate(NULL);				
#endif

		// special case for WM_INITDIALOG
		CRect rectOld;
		DWORD dwStyle = 0;
		if (nMsg == WM_INITDIALOG)
			_AfxPreInitDialog(pWnd, &rectOld, &dwStyle);

		// delegate to object's WindowProc
		lResult = pWnd->WindowProc(nMsg, wParam, lParam);

		// more special case for WM_INITDIALOG
		if (nMsg == WM_INITDIALOG)
			_AfxPostInitDialog(pWnd, rectOld, dwStyle);
	}
	CATCH_ALL(e)
	{
		lResult = AfxProcessWndProcException(e, &pThreadState->m_lastSentMsg);
		TRACE(traceAppMsg, 0, "Warning: Uncaught exception in WindowProc (returning %ld).\n",
			lResult);
		DELETE_EXCEPTION(e);
	}
	END_CATCH_ALL

	pThreadState->m_lastSentMsg = oldState;
	return lResult;
}
致OnInitDialog()在串口初始化之后的代码都没有执行。使得依赖这些代码的代码出现以未初始化为主要特征的异常。一个改进的方式是事先检测串口有没有效果。

     因此在网上查找了一些资料,总结出在串口初始化之前可以使用如下代码:

	HANDLE m_hCom;      
    CString com;

	com.Format("\\\\.\\COM%d",(int)(pMsComm->get__CommPort()));
    m_hCom = CreateFile(com, 0, 0, 0,  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  // 这里的CreateFile函数起了很大的作用,可以用来创建系统设备文件,如果该设备不存在或者被占用,则会返回一个错误,即下面的 INVALID_HANDLE_VALUE ,据此可以判断可使用性。详细参见MSDN中的介绍。
	if(m_hCom == INVALID_HANDLE_VALUE)     // 如果没有该设备,或者被其他应用程序在用    *******************
	{
		int errornum=GetLastError();
		if(errornum==2)
			com.Format("端口%d 不存在",(int)(pMsComm->get__CommPort()));
		else if(errornum==5)
			com.Format("端口%d被占用",(int)(pMsComm->get__CommPort()));
		AfxMessageBox(com);
		CloseHandle(m_hCom); // 关闭文件句柄,后面我们采用控件,不用API
		return ;//这是因为串口初始化封装在另一个函数里面在OnInitDialog调用。
	}
	CloseHandle(m_hCom); // 关闭文件句柄,后面我们采用控件,不用API


使用该代码获取串口是否可用。如果必须要开启串口,可以单独写个 线程,在线程里面循环检测该代码。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要通过Web应用程序访问和读取串口列表,你可以采用以下步骤: 1. 首先,你可以使用JavaScript编写一个前端脚本,通过调用mscomm32对象的方法来实现读取串口列表的功能。在前端脚本中,你可以使用XMLHttpRequest对象或Fetch API与服务器进行通信。 2. 在服务器端,你可以使用编程语言,如Python或Node.js来处理前端请求。根据你选择的编程语言,你可以使用相应的库或模块来读取串口列表。 3. 在服务器端,你可以编写一个处理器函数,用于接收前端请求并执行读取串口列表的操作。根据你选择的编程语言,这个处理器函数可以使用不同的方法来读取串口列表。例如,在Python中,你可以使用pySerial库来读取串口列表;在Node.js中,你可以使用serialport模块来读取串口列表。 4. 在处理器函数中,你可以调用mscomm32对象的相应方法,如getPort()来读取串口列表。将读取到的串口列表返回给前端脚本。 5. 在前端脚本中,你可以通过XMLHttpRequest对象或Fetch API接收到服务器返回的串口列表,并进行相应的处理和展示。 通过以上步骤,你就可以实现一个Web应用程序来读取串口列表。需要注意的是,mscomm32对象可能只在Windows操作系统上可用,因此你需要在部署该应用程序时确认目标服务器的操作系统是否支持mscomm32对象。 ### 回答2: 为了在Web上读取串口列表,我们可以使用JavaScript来实现。由于Web浏览器的安全限制,我们无法直接访问用户计算机上的串口,但是我们可以通过与本地应用程序进行通信来实现。 首先,我们需要在本地创建一个能够读取串口列表的应用程序。可以使用C或C++等编程语言来实现。通过使用串口通讯库如mscomm32等,我们可以轻松获取到可用的串口列表。 接下来,在Web页面上使用JavaScript创建一个WebSocket连接,与本地应用程序进行通信。WebSocket是一种在Web浏览器和服务器之间进行双向通信的技术,我们可以使用它与本地应用程序进行数据交换。 当WebSocket连接建立后,我们可以向本地应用程序发送一个请求,请求获取串口列表的信息。本地应用程序接收到请求后,将串口列表信息通过WebSocket发送到Web页面。 在Web页面上,我们可以使用JavaScript接收到来自本地应用程序的串口列表信息,并将其显示在网页上。我们可以使用HTML和CSS来创建一个用户界面,以呈现串口列表。 需要注意的是,由于Web浏览器的安全策略,我们不能直接访问用户计算机上的串口。该方法只能在用户在Web页面上授权的情况下才能运行。 总结起来,要在Web上读取串口列表,我们需要使用本地应用程序作为中间人,并通过WebSocket与Web页面进行通信,从而获取到串口列表的信息,并在Web页面上进行展示。 ### 回答3: 在Web环境下,使用mscomm32读取串口列表是不可行的。mscomm32是一个ActiveX控件,只能在桌面应用程序中使用,无法在Web环境中使用。 在Web环境中,可以使用HTML5提供的Web Serial API来读取串口列表。Web Serial API允许Web应用程序与串口设备进行通信。 要使用Web Serial API读取串口列表,首先需要在页面中请求获取串口访问权限。可以使用以下代码来请求访问权限: ```javascript navigator.serial.requestPort().then(port => { // 获取到串口访问权限后的处理逻辑 console.log(port); }).catch(error => { // 请求串口访问权限失败的处理逻辑 console.error(error); }); ``` 当用户确认授权后,`requestPort()`方法将返回一个代表串口的`SerialPort`对象,其中包含了串口的详细信息。你可以在控制台中查看这些信息。 请注意,由于Web Serial API是HTML5的一部分,支持程度可能因浏览器而异。在某些浏览器中,可能需要在页面中启用开发者模式或设置特定的标志才能使用Web Serial API。 总之,在Web环境中,我们需要使用HTML5的Web Serial API而不是mscomm32来读取串口列表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值