モデム等を用いた開発をしていると、PCからマイコンボードを経由して直接ATコマンド等をシリアルデバイスに流し込みたい時があります。
Arduino系の場合はサンプルがあるのですが、mbedでは見当たらなかったのでメモ代わりに置いておきます。
論よりコード
main.cpp
# include "mbed.h"
Serial HostPC(USBTX, USBRX);
Serial UARTdevice(PA_0, PA_1); /* Using serial4 on F446RE */
int main() {
HostPC.baud(115200);
HostPC.printf("\r\n-- Start: SerialBridge\r\n");
UARTdevice.baud(9600); /* Check: Baudrate of UARTdevice */
wait(0.2); /* IMPORTANT: waiting for warm-up of UARTdevice */
HostPC.printf("-- Start interactive session (Recommmend: Local echo ON and CRLF)\r\n");
HostPC.printf("-- Example: AT[enter]\r\n");
while(1) {
while (UARTdevice.readable()) HostPC.putc(UARTdevice.getc());
while (HostPC.readable()) UARTdevice.putc(HostPC.getc());
}
}
確認環境
- mbedボード: NUCLEO-F446RE
- シリアルデバイス: Sigfox Shield for Arduino "UnaShield V2S / 20170107"
- IDE: mbed オンラインコンパイラ
解説
mbed.h
のみで実現したので、大体どのボードでも使えるとは思います。
ローカルエコーや改行コードはHost PCのターミナルで設定してください。
オフィシャルのシリアル通信クラスはバッファリングが無いので取りこぼしもありそうです。そのためBufferedSerialを使うのも良さそうです。(出典: mbed シリアル通信クラス)
テンプレートを使わずに「スッピンで」mbedの環境をそろえる
mbed オンラインコンパイラで新しく開発を始めようとすると色々テンプレートがあります。便利ですが、ちょっとしたことを行うにはデカすぎることが多いです。
ゼロから開発する方法を オンラインIDEで、新規から開発する で解説してあります。
参考資料
- mbed シリアル通信クラス / https://qiita.com/matsujirushi/items/88e7943617f6ca1e4f75
- mbedのSerial通信要項 / https://qiita.com/hiRina/items/c642908a7cc0de95658d
あとがき
久々に書いたよ。
EoT