mf
2024年4月17日 15時57分
お世話になります。
Armadillo X2のUART3、UART4について、起動時のボーレートを9600bpsから違うボーレートに起動後のコマンドの実行なしで変更したいです。
※起動後にコマンド実行をすると不安定になるか、正しく実行できるときとできないときがあるため
#define CONFIG_BAUDRATE 変更後のBaudrate
などの固定ファイルの設定値で事前にボーレートを設定する方法を教えて頂けると助かります。
お手数ですがよろしくお願いいたします。
コメント
mf
2024年4月18日 10時28分
早速のご回答ありがとうございます。
現在、Flutterで開発をしており、UARTとの接続に以下のライブラリーを使用しております
https://pub.dev/packages/flutter_libserialport
FlutterからUARTに接続する場合、こちらのライブラリーではポート接続前にボーレート等の設定をするとIllegalStateException か NullPointerException になるため、おっしゃるとおり、UARTの接続後に変更しています。
しかし、そうすると4~5回に1度程度の確率で、接続が不安定になります。
そのため、Flutterアプリ起動時(UART接続前)にSSHで
stty -F /dev/ttymxc2 115200
を実行することも試したのですが、こちらも成功するときと失敗するときがございまして、不安定である状況は変わりませんでした。
UARTのボーレートは固定値であるため、変更したソースコードでLinuxカーネルをビルドし、インストールする方法を試してみようと思います。
ありがとうございました。
> 溝渕です。
>
> > ※起動後にコマンド実行をすると不安定になるか、正しく実行できるときとできないときがあるため
>
> どのような操作をすると、上記のような状態となるか教えていただけますか? 「起動後」の状態の前にuartを利用するアプリケーションを起動していたりしないでしょうか?
>
> というのも、uartは基本的に設定(ボーレート設定を含む)をしてから通信するよう設計されています。なので、正しく利用する場合はデフォルトのボーレートは何であっても構わないはずです。
>
>
> >
> > #define CONFIG_BAUDRATE 変更後のBaudrate > >
> >
> > などの固定ファイルの設定値で事前にボーレートを設定する方法を教えて頂けると助かります。
>
> デフォルトのボーレート(9600bps)は、Linuxカーネルの以下の場所で設定されていますが、
>
> drivers/tty/serial/serial_core.c: uart_register_driver()
>
> ユーザーランドからuartを利用する目的で、Linuxカーネルに手を入れるのは大袈裟に感じます。
>
at_mizo
2024年4月18日 10時47分
溝渕です。
> FlutterからUARTに接続する場合、こちらのライブラリーではポート接続前にボーレート等の設定をするとIllegalStateException か NullPointerException になるため、おっしゃるとおり、UARTの接続後に変更しています。
正しくライブラリを利用していると仮定すると、ライブラリの問題のようですね。
> しかし、そうすると4~5回に1度程度の確率で、接続が不安定になります。
恐らくですが、uart通信を始めた後にボーレート設定が行なわれたのだと思います。この場合、初回通信は9600bpsで実行されます。
> そのため、Flutterアプリ起動時(UART接続前)にSSHで
>
>
> stty -F /dev/ttymxc2 115200 >
>
> を実行することも試したのですが、こちらも成功するときと失敗するときがございまして、不安定である状況は変わりませんでした。
Flutterアプリ実行前にsttyを実行した事はありますか? 例えば、
[armadillo]$ stty -F /dev/ttymxc2 115200; ./app
のようにです。
> UARTのボーレートは固定値であるため、変更したソースコードでLinuxカーネルをビルドし、インストールする方法を試してみようと思います。
上記対応をしてしまうと、Linuxカーネルのupdateの度に変更する必要があるのですよね。これが問題とならないのであれば、変更して構わないと思います。
at_ohsawa
2024年4月18日 11時12分
横から失礼します。
素直にflutter_libserialportの中でportconfigをすれば良いと思うのですが、
その場合にエラーしていますか?
シリアルポートというのは、古い仕組みのデバイスなのでプロセスの間で
排他処理がありません。なので、古来よりデバイスを開いたアプリが
速度等を自分で設定して、終了するときに(できれば)設定を元に戻しておく。
という書き方をします。
(先に設定しておいても、他のアプリが設定変えてるかもしれないので)
なので、シリアルポートを隠蔽するライブラリもそういう作りで
Openして自分で設定しないといけません。
という説明を書いていたらflutter_libserialportのissueに
同じようなハマり方をしている人をみつけました。
正しい書き方についても返信されていますね。
at_mizo
2024年4月17日 16時17分
溝渕です。
> ※起動後にコマンド実行をすると不安定になるか、正しく実行できるときとできないときがあるため
どのような操作をすると、上記のような状態となるか教えていただけますか? 「起動後」の状態の前にuartを利用するアプリケーションを起動していたりしないでしょうか?
というのも、uartは基本的に設定(ボーレート設定を含む)をしてから通信するよう設計されています。なので、正しく利用する場合はデフォルトのボーレートは何であっても構わないはずです。
>
>
> などの固定ファイルの設定値で事前にボーレートを設定する方法を教えて頂けると助かります。
デフォルトのボーレート(9600bps)は、Linuxカーネルの以下の場所で設定されていますが、
drivers/tty/serial/serial_core.c: uart_register_driver()
ユーザーランドからuartを利用する目的で、Linuxカーネルに手を入れるのは大袈裟に感じます。