Armadilloフォーラム

UART3、UART4のデフォルトのBaudrateの変更について

mf

2024年4月17日 15時57分

お世話になります。

Armadillo X2のUART3、UART4について、起動時のボーレートを9600bpsから違うボーレートに起動後のコマンドの実行なしで変更したいです。

※起動後にコマンド実行をすると不安定になるか、正しく実行できるときとできないときがあるため

#define CONFIG_BAUDRATE 変更後のBaudrate

などの固定ファイルの設定値で事前にボーレートを設定する方法を教えて頂けると助かります。

お手数ですがよろしくお願いいたします。

コメント

溝渕です。

> ※起動後にコマンド実行をすると不安定になるか、正しく実行できるときとできないときがあるため

どのような操作をすると、上記のような状態となるか教えていただけますか? 「起動後」の状態の前にuartを利用するアプリケーションを起動していたりしないでしょうか?

というのも、uartは基本的に設定(ボーレート設定を含む)をしてから通信するよう設計されています。なので、正しく利用する場合はデフォルトのボーレートは何であっても構わないはずです。

>

> #define CONFIG_BAUDRATE 変更後のBaudrate
> 

>
> などの固定ファイルの設定値で事前にボーレートを設定する方法を教えて頂けると助かります。

デフォルトのボーレート(9600bps)は、Linuxカーネルの以下の場所で設定されていますが、

drivers/tty/serial/serial_core.c: uart_register_driver()

ユーザーランドからuartを利用する目的で、Linuxカーネルに手を入れるのは大袈裟に感じます。

早速のご回答ありがとうございます。

現在、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カーネルに手を入れるのは大袈裟に感じます。
>

溝渕です。

> 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の度に変更する必要があるのですよね。これが問題とならないのであれば、変更して構わないと思います。

横から失礼します。

素直にflutter_libserialportの中でportconfigをすれば良いと思うのですが、
その場合にエラーしていますか?

シリアルポートというのは、古い仕組みのデバイスなのでプロセスの間で
排他処理がありません。なので、古来よりデバイスを開いたアプリが
速度等を自分で設定して、終了するときに(できれば)設定を元に戻しておく。
という書き方をします。
(先に設定しておいても、他のアプリが設定変えてるかもしれないので)

なので、シリアルポートを隠蔽するライブラリもそういう作りで
Openして自分で設定しないといけません。

という説明を書いていたらflutter_libserialportのissueに
同じようなハマり方をしている人をみつけました。
正しい書き方についても返信されていますね。

https://github.com/jpnurmi/flutter_libserialport/issues/29