为什么串口大9初始化会报错?

程序中串口配置大于9初始化就会报错,看看代码,这样写的:

为什么串口大9初始化会报错?_第1张图片

原来被限制了,改成如下代码

为什么串口大9初始化会报错?_第2张图片

立即生成,运行依然报错!

为什么串口大9初始化会报错?_第3张图片


检查代码并无异象,但原因肯定在于初始化的地方,于是对这个函数产生了怀疑

为什么串口大9初始化会报错?_第4张图片

        这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道。

        利用这个函数打开串口时,如果为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
                      );

你可能感兴趣的:(com10)