Windows打开10及10以上串口

    今天用以前的一个串口程序,发现串口怎么也打不开。因为用的串口不是常规的COM1 - COM9而是COM10及10以上的端口,想着是很简单的,增加几个选项就可以轻松搞定的,结果加上后测试,发现总是初始化失败,调试发现在CreateFile里总是失败,找到MSDN一看果然这里有区别。

    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",    // 定义串口名

GENERIC_READ | GENERIC_WRITE,   // 存取模式(读写)

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

NULL,             // 保密性

OPEN_EXISTING,    // 必须设置为OPEN_EXISTING
0,                // 文件属性,如果是异步模式,可设置为 FILE_FLAG_OVERLAPPED
NULL              // 模版,串口设备必须设置为NULL
);

    改正后程序正常运行!
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用C++编写的Windows 10串口通信源代码示例: ``` #include <Windows.h> #include <iostream> #include <string> using namespace std; int main() { HANDLE hSerial; DCB dcbSerialParams = { 0 }; COMMTIMEOUTS timeouts = { 0 }; DWORD dwBytesWritten; DWORD dwBytesRead; bool success; // 打开串口 hSerial = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hSerial == INVALID_HANDLE_VALUE) { cout << "Error opening serial port" << endl; return 1; } // 配置串口参数 dcbSerialParams.DCBlength = sizeof(dcbSerialParams); success = GetCommState(hSerial, &dcbSerialParams); if (!success) { cout << "Error getting serial port state" << endl; CloseHandle(hSerial); return 1; } dcbSerialParams.BaudRate = CBR_9600; dcbSerialParams.ByteSize = 8; dcbSerialParams.StopBits = ONESTOPBIT; dcbSerialParams.Parity = NOPARITY; success = SetCommState(hSerial, &dcbSerialParams); if (!success) { cout << "Error setting serial port state" << endl; CloseHandle(hSerial); return 1; } // 配置串口超时时间 timeouts.ReadIntervalTimeout = 50; timeouts.ReadTotalTimeoutConstant = 50; timeouts.ReadTotalTimeoutMultiplier = 10; timeouts.WriteTotalTimeoutConstant = 50; timeouts.WriteTotalTimeoutMultiplier = 10; success = SetCommTimeouts(hSerial, &timeouts); if (!success) { cout << "Error setting serial port timeouts" << endl; CloseHandle(hSerial); return 1; } // 发送数据 string dataToSend = "Hello, world!"; success = WriteFile(hSerial, dataToSend.c_str(), dataToSend.size(), &dwBytesWritten, NULL); if (!success) { cout << "Error writing to serial port" << endl; CloseHandle(hSerial); return 1; } // 接收数据 char buffer[1024] = { 0 }; success = ReadFile(hSerial, buffer, sizeof(buffer), &dwBytesRead, NULL); if (!success) { cout << "Error reading from serial port" << endl; CloseHandle(hSerial); return 1; } else { cout << "Received data: " << buffer << endl; } // 关闭串口 CloseHandle(hSerial); return 0; } ``` 注意,上述代码中使用的串口号是COM1,如果你需要使用其他串口号,需要根据实际情况进行修改。另外,代码中使用的波特率是9600,数据位是8位,停止位是1位,无校验位,如果你需要使用其他参数,也需要进行相应的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值