Arduino
STM32
STM32F103C8

STM32でシリアル通信

XSHELLの川崎です。STM32マイコンボード「STM32F103C8」ボードを使ってでシリアル通信のテストをします。

  • 環境
    Arduino 1.8.5 + Arduino_STM32

  • マイコンボード

RobotDyn STM32F103C8 Dev.Board

やったこと

  1. シリアルポート1~3で通信
  2. シリアルポート2の受信データをシリアルポート1の送信にする
  3. シリアルポート1の送受信データをシリアルポート2の送受信データにする

1.シリアルポート1~3で通信

下記コードでシリアルポート1~3までの動作確認
loop内のSerial1の部分は適宜変更

char input[10];   // 文字列格納用
int i = 0;  // 文字数のカウンタ

void setup() {
  Serial1.begin(115200);
  Serial1.println("Serial port1");
  Serial2.begin(115200);
  Serial2.println("Serial port2");
  Serial3.begin(115200);
  Serial3.println("Serial port3");
}

void loop() {
  // データ受信
  if (Serial1.available()) {
    input[i] = Serial1.read();
     // 末尾に改行あったら送信
    if (input[i] == '\n') {
      // 受信文字列を送信
      Serial1.println(input);
      Serial1.println("\n");
      // カウンタ初期化
      i = 0;
    }else{
      i++;
    }
  }
}

Arduinoの開発環境のシリアルモニタで動作確認。

2.シリアル2の受信データをシリアル1の送信にする

char input[1] = {0};

void setup() {
  Serial1.begin(115200);
  Serial1.println("Serial port1");
  Serial2.begin(115200);
  Serial2.println("Serial port2");
  Serial3.begin(115200);
  Serial3.println("Serial port3");
}

void loop() {
  // データ受信したとき
  if (Serial2.available()) {
    input[0] = Serial2.read();
    // 受信文字列を送信
    Serial1.print(input);
    Serial1.print("\n");
  }
}

結果、1行1文字になった↓ので改行が来た時だけ改行(Serial1.print(“\n”);を実行するよう変更

)
h
o
g
e
h
o
g
e

変更部分のみ記載

void loop() {
  // データ受信したとき
  if (Serial2.available()) {
    input[0] = Serial2.read();
    // 受信文字列を送信
    Serial1.print(input);
    if (input[0] == '\n') {
        Serial1.print("\n");
    }
  }
}

結果、改行効かずに下記のようになった

                                                               Serial port1
 raspberrypi login: hogehoge    kaigyoudekinai

原因はrasbianで実行している下記picocomコマンドの改行コードが\rだったから
picocomコマンドにオプションを付けて改行コードを\nを実行

picocom --omap crlf -b 115200 /dev/ttyS0

MacやWindowsを考慮して下記に変更

void loop() {
  // データ受信したとき
  if (Serial2.available()) {
    input2[0] = Serial2.read();
    Serial1.print(input2);
    if (input[0] == '\n' || input[0] == '\r' || input[0] == '\n\r') {
        Serial1.print("\n");
    }
  }
}

できました。