2014-05-22 145 views
0

我必須在實驗室中使用其中一個硬件編寫串行通信。在Linux上進行第一對讀取和寫入後,串行端口掛起

使用bash,我可以寫我的時候,我想和receve resposnes有:

cat < /dev/ttyUSB0 & 
echo 'SM?' >/dev/ttyUSB0 
# SM=0480; 
echo 'SMM=0475;' > /dev/ttyUSB0 
echo 'SM?;' > /dev/ttyUSB0 
# SM=0475; 

我寫與ASIO一個簡單的C++應用程序,也應該這樣做。

#include <asio.hpp> 
#include <asio/serial_port.hpp> 
#include <thread> 

int main(){ 
    asio::io_service service; 
    asio::serial_port port(service,"/dev/ttyUSB0"); 
    port.set_option(asio::serial_port_base::baud_rate(9600)); 
    port.set_option(asio::serial_port_base::character_size(8)); 
    port.set_option(asio::serial_port_base::parity(asio::serial_port_base::parity::none)); 
    port.set_option(asio::serial_port_base::stop_bits(asio::serial_port_base::stop_bits::one)); 
    port.set_option(asio::serial_port_base::flow_control(asio::serial_port_base::flow_control::none)); 


    std::vector<char> ret(100); 
    int len; 
    asio::error_code ignored; 
    asio::write(port,asio::buffer("SM?;"),asio::transfer_all(),ignored); 
    len=port.read_some(asio::buffer(ret),ignored); 
    std::cout.write(ret.data(),len); 
    asio::write(port,asio::buffer("SSM=0480;"),asio::transfer_all(),ignored); 
    asio::write(port,asio::buffer("SM?;"),asio::transfer_all(),ignored); 
    len=port.read_some(asio::buffer(ret),ignored); 
    std::cout.write(ret.data(),len); 

    std::cout << std::endl; 
    port.cancel(); 
    port.close(); 
    service.stop(); 
    service.reset(); 
    return 0; 
} 

但是代碼掛在第二次讀取。我究竟做錯了什麼?

回答

0

難道你沒有忘記緩衝區中的\ n嗎? echo在字符串中添加'\n'字符,除非您使用-n

strace是調試此類問題的好工具。

+0

嗯。硬件規範說,在這種情況下終止字符是';'。今天我已經沒有實驗室了,所以我無法測試它,但在這種情況下,第一次讀取也會掛起。 – UldisK

相關問題