MFC 打来COM10及以上的串口

Win32 API函数CreateFile()除了可打开普通文件外,还可以打开设备,比如可用于打开串口,获得串口句柄。

使用CreateFile()函数打开串口时文件共享模式应设置为0(表示独占),创建参数设置为OPEN_EXISTING,模板必须设置为NULL。

如果为COM1至COM9,可使用“COM1”-“COM9”作为文件名传递给CreateFile()函数,函数可成功返回。但是,如果操作对象为COM10及以上的端口,以此方式命名文件名调用CreateFile()函数会返回INVALID_HANDLE_VALUE,表示端口无法打开。

产生这种奇怪现象的原因是:微软预定义的标准设备中含有“COM1”-“COM9”。所以,“COM1”-“COM9”作为文件名传递给函数时操作系统会自动地将之解析为相应的设备。但对于COM10及以上的串口,“COM10”之类的文件名系统只视之为一般意义上的文件,而非串行设备。

为了增加对COM10及以上串行端口的支持,微软规定,如果要访问这样的设备,应使用这样的文件名(以COM10为例):\\.COM10

所以,对于COM10及以上的串口,CreateFile()的调用样式应调整如下:

CreateFile(

"\\\\.\\COM10",           // 定义串口名

fdwAccess,                // 存取模式(读写)

0,                               // 共享模式:必须设置为0,表示设备独占使用

NULL,                        // 保密性

OPEN_EXISTING,      // 必须设置为OPEN_EXISTING

0,                               // 文件属性,如果是异步模式,可设置为

NULL                         // 模版,串口设备必须设置为NULL

);

 

char szPort[50];
	if (portNo < 10)
	{
		sprintf_s(szPort, "COM%d", portNo);
	}
	else
	{
		sprintf_s(szPort, "\\\\.\\COM%d", portNo);
	}
	

	/** 打开指定的串口 */
	m_hComm = CreateFileA(szPort,  /** 设备名,COM1,COM2等 */
		GENERIC_READ | GENERIC_WRITE, /** 访问模式,可同时读写 */
		0,                            /** 共享模式,0表示不共享 */
		NULL,                         /** 安全性设置,一般使用NULL */
		OPEN_EXISTING,                /** 该参数表示设备必须存在,否则创建失败 */
		0,
		0);

 

你可能感兴趣的:(MFC)