シリアル通信にブースト asio を使用しようとしています。私は現在 Windows で作業していますが、最終的にはコードを Linux に移行する予定です。コンピューターを再起動すると、プログラムから送信されたデータが本来あるべきものではなくなり (たとえば、null の後にキャリッジ リターンを送信し、"00111111 10000011" をバイナリで取得する)、一貫性がありません (複数の null によって異なるバイナリが生成されます)。 .
ただし、他のプログラムを使用してシリアルポートにデータを送信し、プログラムを再度実行するとすぐに、完全に機能します。ポートの初期化で何かが欠けているに違いないと思いますが、私の調査では何も判明していません。
ポートを開く方法は次のとおりです。
// An IOService to get the socket to work
boost::asio::io_service *io;
// An acceptor for getting connections
boost::shared_ptr<boost::asio::serial_port> port;
// Cnstructor Functions
void Defaults() {
io = new boost::asio::io_service();
// Set Default Commands
command.prefix = 170;
command.address = 3;
command.xDot[0] = 128;
command.xDot[1] = 128;
command.xDot[2] = 128;
command.throtle = 0;
command.button8 = 0;
command.button16 = 0;
command.checkSum = 131;
}
void Defaults(char * port, int baud) {
Defaults();
// Setup the serial port
port.reset(new boost::asio::serial_port(*io,port));
port->set_option( boost::asio::serial_port_base::baud_rate( baud ));
// This is for testing
printf("portTest: %i\n",(int)port->is_open());
port->write_some(boost::asio::buffer((void*)"\0", 1));
boost::asio::write(*port, boost::asio::buffer((void*)"\0", 1));
boost::asio::write(*port, boost::asio::buffer((void*)"\r", 1));
boost::asio::write(*port, boost::asio::buffer((void*)"\r", 1));
Sleep(2000);
}
編集:関連のないコードを削除しようとして、ボーレートを設定した行を誤って削除してしまい、元に戻しました。また、ヌルモデムとドックライトで出力を確認しています。ボーレートは別として、ブーストシリアルポートに指定されたデフォルトのシリアル設定をすべて使用しています(明示的に設定しても効果がありませんでした)。