ユキのワクワク日記

ユキのワクワク日記

PR

サイド自由欄


・このブログの目的
自分の作った物のメモや、他の人にもお勧めしたいもの、自分が詰まって大変だったところなどについて。
また、自分が学習した内容を書き記すことにより、自分のメモ及び、他の人にも良いものを知ってもらいたいと思い、書いています。

※mbed、STM32の記事は下記サイトに移行しました。
Project_OKIはてなブログ


内容
・ビジネス書籍のまとめ。
・見た漫画、アニメ、動画などについて
・ものづくり
・副業について

こちらもよかったらお願いします。
私のインスタグラムです
私のtwitterです

プロフィール

yuki9580

yuki9580

カレンダー

カテゴリ

カテゴリ未分類

(58)

電子工作

(25)

C言語勉強メモ

(1)

C++勉強メモ

(12)

C言語(組み込み):STM32(mbed)

(0)

少女漫画

(6)

英語

(18)

アニメ

(4)

料理

(11)

漫画!

(8)

食べに行こう

(4)

見たyoutube

(14)

読書

(24)

各種イベント参加

(0)

習慣日記

(32)

副業(FX)

(9)

FX(言葉の意味)

(8)

ライフコンシェルジュに相談してみた

(4)

ふるさと納税

(0)

暗号資産関連

(2)

遊戯王

(1)

目標

(14)

AI関連

(3)

日記

(3)

キーワードサーチ

▼キーワード検索

2021.07.05
XML
カテゴリ: 習慣日記
今日やること:
・最終目標: STM32のUARTで、DFplayerのコマンドを送り動作させる。
  ・DFplayerは、複数のデータを送る必要がある。
  ・STM32のUARTで、データを複数設定して送る。(配列??)

・疑問点:
  ・charでTeratermには送れているが、外部機器への送信も、Teratermに送るものと同じでよいのか?
  ・一個ずつHAL_UART_Transmitで送れるが、複数設定して送る方法は?
  ・いまいちHAL_UART_Transmitの使い方、書き方がよくわからん。


HAL_UART_Transmitで2次元配列でやってみた。
下記をmainの中に記載


//ーーーーーーーーーーーー
   //uint8_t data2[5][5] = {"START","TEST","TEST2","1234567"}; 5文字に対して、1234567が長すぎるとエラーになる。

   uint8_t data2[5][5] = {"START","TEST","TEST2","12345"};
   //&data2[0][0]だと、START、TESTの先頭から5文字送信
   //&data2[0][1]だと、START、TESTの先頭2文字目から5文字送信(TARTT)

   HAL_UART_Transmit(&huart2,&data2[1][0],5,100); //TESTを送信
   HAL_UART_Transmit(&huart2,&data2[2][0],5,100); //TEST2を送信
   HAL_UART_Transmit(&huart2,&data2[0][1],5,100); //START、TESTの先頭2文字目から5文字送信(TARTT)

//ーーーーーーーーーーー
作成したプログラム:https://github.com/yuta009/UART_Practice2

一応、2次元配列使えば、複数文字を送れるようになったっぽい。

HAL_UART_Transmit(&huart2,data2,strlen((char*)data2,100);
第一引数:UARTハンドラ
第二引数:送信するために格納されたバッファ
    (pData: Pointer to data buffer (u8 or u16 data elements))
第三引数:送信byte数
第四引数:タイムアウト時間

送信byte数を、数字ではなく、文字列の数を取得して、送信できるようにしたい。

参考:​ strlenについて
   strlen:文字列 *sの長さを返す。

//ーーーーーーーーーーーー
 文字列の長さの取得
 【書式】
 #include <string.h>
 size_t strlen(const char *s);
 【説明】
 文字列*sの長さを取得し返却します。長さに'\0'は含みません。
 【引数】
 const char *s : 文字列
 【戻り値】
 文字列*sの長さ。
 【使用例】
//ーーーーーーーーー
code:c
 #include <stdio.h>
 #include <string.h>
 int main(void)
 {
     int len;
     char s[] = "today";
     len = strlen(s);
     printf("\"%s\" は %d 文字\n", s, len);
     printf("\"%s\" は %d 文字\n", "hello world", strlen("hello world"));
     return 0;
 }
//ーーーーーーーーーー
 【実行結果】
 "today" は 5 文字
 "hello world" は 11 文字


 →2次元配列に対して、strlenは使用できない。
c言語では、2次元配列の長さ取得に、sizeofが使用できる。


//ーーーーーーーーーーーー
 uint8_t data2[10][10] = {"START\r\n","TEST\r\n","Push\r\n","123456789"};
//\r\n :改行
 HAL_UART_Transmit(&huart2,&data2[1][0],10,100); //TESTを送信

 //下記に置き換えると自分で指定しなくても文字列の長さの取得が出来る。
 //sizeof(data2[1])は、配列の左から2個めの長さを取得する。
 //sizeof(data2[1][0])にすると、[2][1]の文字の長さ、つまり1文字分の長さを取得する。
 HAL_UART_Transmit(&huart2,&data2[1][0],sizeof(data2[1]),100); //TESTを送信

//ーーーーーーーーーーーーーーーーー
これで、複数の文字列を送るのに、楽になった。
少しだけ、HAL_UART_Transmitについて理解できた気がする。
思ったより順調で良き。


次は、DFplayerにコマンドを送信するプログラムを考えていく。
DFplayerのデータシート:​ データシート
日本語訳(参考資料):​ シリアル通信可能なMP3プレイヤー

外部に送る為、使用するのは、UART1を使用するが、プログラム確認用にUART2でPCにも出力するようにする。

今回は緊急時などで使う事はなく、安定性をそこまで求めなくても良いため、チェックサムはつけない。

使用するメモリ:SD card mini
コマンド確認

(1) デバイスの指定
・TFカードを指定する。(SD カードmini を使用する為)
 →7F FF 06 09 00 00 01 EF 


 7F:Start byte(開始する)
 FF:Version(バージョン情報)
 06:Len(文字の長さ:チェックサムは含まない文字の長さを指定)
 09:Commandの指定(使用するデバイスの指定)
 00:Feedbackを指定(1:フィードバックを必要 0:フィードバック不要)
 00:コマンドに付属するパラメータの上位バイト
 01:コマンドに付属するパラメータの下位バイト(0:U 、1:TF 、2:AUX(PC) 、3:Sleep、4:Flash)
 EF:End bit (終了する)

(2)200ms 待つ

(3) 動作させるコマンドを送る
 ・次の曲を再生するコマンドを送る。
  →7F FF 06 01 00 00 00 EF

 7F:Start byte(開始する)
 FF:Version(バージョン情報)
 06:Len(文字の長さ:チェックサムは含まない文字の長さを指定)
 01:Commandの指定(次の曲:01)
 00:Feedbackを指定(1:フィードバックを必要 0:フィードバック不要)
 00:コマンドに付属するパラメータの上位バイト
 00:コマンドに付属するパラメータの下位バイト
 EF:End bit (終了する)



データを送るように、変更してみたが、上手く出来ない・・・
なんか、処理が間違ってるんだろうけど。
わからん。


arduinoとかで、ライブラリを使わずに、使用している人がいないか。
ライブラリを使わないでやる場合どうやってるのか調べてみよう。

作成プログラム:​ DFplayer2(UART)

UARTのプログラムについて、ライブラリを見ると、単純にコマンドを送れば、繋がるというわけではなさそう。
もうちょっと調査と理解が必要かな。

ただ、疲れたので、今日はSTM32の学習は一旦終わりとする。

進捗:2次元配列を使用して、UART通信で比較的簡単に、データを送れそうになった。

関連記事
 ​ STM32勉強日記(2021/7/4)





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2021.07.05 20:10:57
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
X
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: