boost庫有一個asio,支持串口通信。
步驟:
1、產生一個boost::asio::io_service(前攝模式,類似于完成端口,不過,可以針對不同IO對象)
2、構造一個boost::asio::serial_port,有兩種方法:
?。ㄒ唬゜oost::asio::serial_port m_serialPort(m_IoService, "COM1");
?。ǘ゜oost::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)
?{
?}
創(chuàng)新互聯(lián)公司長期為近1000家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為若羌企業(yè)提供專業(yè)的成都網站制作、成都做網站,若羌網站改版等技術服務。擁有十多年豐富建站經驗和眾多成功案例,為您定制開發(fā)。
3、設置串口參數(shù):波特率、奇偶校驗 位、停止位、字符大小和流量控制,通過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、數(shù)據(jù)讀寫
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系統(tǒng)崩潰,崩潰的信息如下:
1)第一種情形 終止代碼:DRIVER_IRQL_NOT_LESS_EQUAL
2)第二種情形? wdf01000sys藍屏
解決
1)通過串口轉網卡,連接到串口服務器解決
2)采用Windows的原生接口解決