您好,登錄后才能下訂單哦!
boost庫有一個asio,支持串口通信。
步驟:
1、產生一個boost::asio::io_service(前攝模式,類似于完成端口,不過,可以針對不同IO對象)
2、構造一個boost::asio::serial_port,有兩種方法:
(一)boost::asio::serial_port m_serialPort(m_IoService, "COM1");
(二)boost::asio::serial_port m_serialPort(m_IoService);
m_serialPort.open("COM1");
注意這種方式打開,如果串口沒有準備好,會導致程序拋異常,導致程序崩潰,所以應該要try{} catch包含,或者使用如下的方式
?boost::system::error_code ec;
?serial_port sp(iosev);
?m_serialPort.open("COM1", ec);
?if (ec)?return;
或者
?try
?{
???????????? boost::asio::serial_port m_serialPort(m_IoService);
m_serialPort.open("COM1"); s
?}
?catch (exception& err)
?{
?}
3、設置串口參數:波特率、奇偶校驗 位、停止位、字符大小和流量控制,通過set_option方法
boost::asio::serial_port::baud_rate ?? 波特率
boost::asio::serial_port::parity ???????? 奇偶校驗,可以為serial_port::parity::none / odd / even。
boost::asio::serial_port::flow_control????? 流量控制, 可以為serial_port::flow_control::type,enum類型,可以是none software hardware
boost::asio::serial_port::stop_bits????????? 停止位,??? 可以為serial_port::stop_bits::one /onepointfive /two
boost::asio::serial_port::character_size?? 字符大小
4、數據讀寫
read_some
write_some
?? async_read_some
async_write_some
????? 5、同步讀取例子
?io_service iosev;
?boost::system::error_code ec;
?serial_port sp(iosev);
?sp.open("COM1", ec);
?
?if (ec)?return;
?sp.set_option(serial_port::baud_rate(9600));
?sp.set_option(serial_port::flow_control(serial_port::flow_control::none));
?sp.set_option(serial_port::parity(serial_port::parity::none));
?sp.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
?sp.set_option(serial_port::character_size(8));
?std::string strCompleteMsg;
?boost::asio::streambuf content_sb;
?int bytes = 0;
?while (1)
?{
??strCompleteMsg = "";
??bytes = 0;
??while (strCompleteMsg.find("\r\n") == std::string::npos)
??{
???bytes += boost::asio::read(sp, content_sb, boost::asio::transfer_exactly(1), ec);
???if (ec) break;
???boost::asio::streambuf::const_buffers_type cont_bufs = content_sb.data();
???strCompleteMsg = std::string(boost::asio::buffers_begin(cont_bufs), boost::asio::buffers_begin(cont_bufs) + bytes);
??}
?}
問題
??????? 按照提供的代碼,在阻塞等待時間的過程中,會導致Win10系統崩潰,崩潰的信息如下:
1)第一種情形 終止代碼:DRIVER_IRQL_NOT_LESS_EQUAL
2)第二種情形? wdf01000sys藍屏
解決
1)通過串口轉網卡,連接到串口服務器解決
2)采用Windows的原生接口解決
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。