質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

Q&A

解決済

1回答

1246閲覧

boost asioを用いたシリアル通信ができない!

Katy7

総合スコア20

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。

0グッド

0クリップ

投稿2022/05/18 08:48

状況

boost asioでserial通信ができない

環境

Visual Studio 2022
Windows 11
Boost 1.79

詳細

私はBoostのライブラリであるasioを用いて、シリアル通信を行おうと思っています。
b2ビルドでは以下のコマンドを実行し、Visual Studioでおそらく適切なリンクを行いました(少し自信がない)

>b2.exe --toolset=msvc-14.3 link=static runtime-link=shared,static install

次に以下の記事を参考に下記のコードを実行しました。
http://blog.livedoor.jp/k_yon/archives/52145222.html

cpp

1#include <boost/asio.hpp> 2#include <iostream> 3 4using namespace boost::asio; 5 6int main() 7{ 8 //if (argc != 2) { 9 // std::cerr << "Usage: SerialTest str" << std::endl; 10 // return 1; 11 //} 12 std::cout << "Start" << std::endl; 13 14 std::string wbuf = "kyounotekinkihahare"; 15 char rbuf[32]; 16 std::size_t length; 17 18 const char* PORT = "COM8"; 19 io_service io; 20 serial_port port(io,PORT); 21 port.set_option(serial_port_base::baud_rate(921600)); 22 port.set_option(serial_port_base::character_size(8)); 23 port.set_option(serial_port_base::flow_control(serial_port_base::flow_control::none)); 24 port.set_option(serial_port_base::parity(serial_port_base::parity::none)); 25 port.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one)); 26 27 port.write_some(buffer(wbuf)); 28 length = port.read_some(buffer(rbuf)); 29 30 std::cout.write(rbuf, length); 31 32 return 0; 33}

これをビルドするとビルド自体は成功し、実行ファイルが生成されるのですが、
生成した実行ファイルを実行すると以下のようなMSVC++ ランタイムライブラリがエラーを吐きます。

Debug Error! abort() has been called

デバッガで例外を吐いている場所を探すと以下の場所でハンドルしていない例外を吐いているようです。

serial_port port(io,PORT);

C++ランタイムライブラリがエラーをはいているということで、Propertyのランタイムライブラリの設定のDLLを外して、boostのstaticライブラリをリンクしたりしたのですが、解決しませんでした。

教えてほしいこと

このエラーが起きている理由と具体的な解決方法を教えていただけないでしょうか?
ランタイムライブラリなどについてあまり詳しくなく申し訳ないのですが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/05/18 13:01

boostは知りませんが、とりあえずCOM8が存在すること、他のアプリが握っていないことは確認しているのでしょうか。(まぁ、普通真っ先に確認することでしょうけど、確認したと書かれていない以上疑ってかからないと)
matukeso

2022/05/18 15:24

おそらくboost::system::system_errorが例外で飛んできているので、つかまえてwhat()を出してみては。
guest

回答1

0

自己解決

thkanaさん、matukesoさん、ご回答いただき、本当にありがとうございます。
修正欄では長くなりそうでしたので、ここに記述させていただきます。

matukesoさん

ご指摘頂いた通りに、例外をcatchして表示させてみました。するとエラー文としては以下の内容でした。

open: 指定されたファイルが見つかりません。 [system:2]

また、この文を参考に該当のコードを追っていくと以下の部分が影響していそうなことがわかりました。

basic_serial_port(const executor_type& ex, const char* device) : impl_(0, ex) { boost::system::error_code ec; impl_.get_service().open(impl_.get_implementation(), device, ec); boost::asio::detail::throw_error(ec, "open"); }

ここでopenのさきは参照できなかったので、openはおそらくOS側の関数?だということがわかりました。

thkanaさん

申し訳ございません、COMについてはおっしゃる通り詳しく調べておりませんでした。
私自身も質問に書かれていないことを疑うことは正しいと思います。

今回、私はソースコードを実行することで指定されたCOMポートがオープンされ、通信を行うことが可能になると考えていました。(つまり、コード実行後にUSBをさしても問題ないと考えていた)
また、USBを先に繋いだときには、Teratermでシリアルの内容も監視していました。
つまり、コードを実行する上で、
・COMポートが開放されていない
・別のソフトウェアが握っている
のどちらかの状態が重なっていました。
ここで、matukesoさんから頂いた指摘により、なにかしらファイルが見つからないことがわかりました。
以前ラズパイを少し触ったときにハードウェアの状態をファイルで管理するということを知っていたので、
もしかしてこのファイルはCOMのファイルではないかと思い、頂いた指摘を反映して以下の状態で実行してみました。
・Teratermを使わない。
・USBを予めつなげCOMポートをオープンし、そのポート番号をコードに書き込む。
すると、無事にコードを実行することができました。

頂いたご指摘を参考に、無事に解決できたので嬉しいです。
thkanaさん、matukesoさん本当にありがとうございました。

投稿2022/05/19 13:54

Katy7

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

同じタグがついた質問を見る

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Boost

Boost (ブースト)は、C++の先駆的な開発者のコミュニティ、 またそのコミュニティによって公開されているオープンソースライブラリのことを指します。