leelib.com
域名年龄: 13年11个月17天HTTP/1.1 200 OK 服务器:GitHub.com 类型:text/html; charset=utf-8 修改日期:2015年10月12日 16:03:18 Access-Control-Allow-Origin: * 过期时间:2015年11月08日 16:10:36 缓存控制:max-age=600 Content-Encoding: gzip X-GitHub-Request-Id: C71B4F1A:592B:EEBE6FD:563F0122 文件大小:13521 接受单位:字节 访问时间:2015年11月08日 16:00:36 代理服务器:1.1 varnish 文件时间(秒):0 连接:keep-alive X-Served-By: cache-lax1423-LAX 缓存代理:MISS X-Cache-Hits: 0 X-Timer: S1446969636.458839,VS0,VE70 动作:Accept-Encoding X-Fastly-Request-ID: 40a1f8f4e3f9f1f94ce199ab8c24d23c2217f1e7 网站编码:utf-8
李略帅少壮不努力,一生在内地主页归档关于消失SearchWindows10 下 boost::asio::serial_port 的 BUGByleaker发表于 2015-10-10在最近写一些串口操作的程序时使用了 boost::asio::serial_port 来操作串口但当尝试打开串口的时候出现了错误。下面是我的测试代码:1234567891011121314151617boost::asio::io_service _io_service;const std::string devname = "COM3";try{boost::asio::serial_port serial(_io_service);serial.open(devname);// throw error every times.if (serial.is_open()) {std::cout << devname << " serial open successed." << std::endl;}else {std::cout << devname << " serial open failed!" << std::endl;}}catch (const std::exception& ex){std::cout << ex.what() << std::endl;// GetLastError() == 87}每次都会出现错误87。即 GetLastError() 的结果为 87于是跟进代码里面调试追到了 win_iocp_serial_port_service::open 函数里win_iocp_serial_port_service::open 函数的实现如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869boost::system::error_code win_iocp_serial_port_service::open(win_iocp_serial_port_service::implementation_type& impl,const std::string& device, boost::system::error_code& ec){if (is_open(impl)){ec = boost::asio::error::already_open;return ec;}std::string name = (device[0] == '\\') ? device : "\\\\.\\" + device;::HANDLE handle = ::CreateFileA(name.c_str(),GENERIC_READ | GENERIC_WRITE, 0, 0,OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);if (handle == INVALID_HANDLE_VALUE){DWORD last_error = ::GetLastError();ec = boost::system::error_code(last_error,boost::asio::error::get_system_category());return ec;}using namespace std;::DCB dcb;memset(&dcb, 0, sizeof(DCB));dcb.DCBlength = sizeof(DCB);if (!::GetCommState(handle, &dcb)){DWORD last_error = ::GetLastError();::CloseHandle(handle);ec = boost::system::error_code(last_error,boost::asio::error::get_system_category());return ec;}dcb.fBinary = TRUE;dcb.fDsrSensitivity = FALSE;dcb.fNull = FALSE;dcb.fAbortOnError = FALSE;if (!::SetCommState(handle, &dcb)){DWORD last_error = ::GetLastError();// lee: error is here!!!::CloseHandle(handle);ec = boost::system::error_code(last_error,boost::asio::error::get_system_category());return ec;}::COMMTIMEOUTS timeouts;timeouts.ReadIntervalTimeout = 1;timeouts.ReadTotalTimeoutMultiplier = 0;timeouts.ReadTotalTimeoutConstant = 0;timeouts.WriteTotalTimeoutMultiplier = 0;timeouts.WriteTotalTimeoutConstant = 0;if (!::SetCommTimeouts(handle, &timeouts)){DWORD last_error = ::GetLastError();::CloseHandle(handle);ec = boost::system::error_code(last_error,boost::asio::error::get_system_category());return ec;}if (handle_service_.assign(impl, handle, ec))::CloseHandle(handle);return ec;}发现每次在第一次 SetCommState 的时候总是会报错并离开。于是查看了前面通过 GetCommState 获取到的 dcb 的值。发现 dcb.BaudRate == 0 时无法 SetCommState 成功也就是说在有些设备中获取不到 dcb.BaudRate 这个值。下面是我自己的解决办法在 win_iocp_serial_port_service.ipp 文件的88行左右添加1if (dcb.BaudRate == 0) dcb.BaudRate = 115200;修改后的 win_iocp_serial_port_service::open
© 2010 - 2020 网站综合信息查询 同IP网站查询 相关类似网站查询 网站备案查询网站地图 最新查询 最近更新 优秀网站 热门网站 全部网站 同IP查询 备案查询
2024-05-17 23:28, Process in 0.0101 second.