質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

4回答

3866閲覧

[STM32VLDiscovery]UART受信ができない。

kakuwane

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2020/01/19 00:33

前提・実現したいこと

STM32VLDiscoveryにて、UARTの受信を実現したい。

発生している問題・エラーメッセージ

STM32CubeMXにて、ソースを自動生成して、送信は出来ています。
通信速度は9600Bpsです。

受信は最初の1byte目しか受信ができていない。
続けて、2byteも受信したいのですが、リードができないです。

作成しているコード

### 該当のソースコード char buf[]={0x7e,0xff,0x06,0x0f,0x00,0x01,0x01,0xef}; //送信データ HAL_UART_Transmit(&huart1,(uint8_t*)buf,sizeof(buf),0xffff); while (1) { HAL_UART_Receive(&huart1,(uint8_t *)buf3, sizeof(buf3), 0xF); //データ受信 if(i<10){ rxbuf[i]=buf3[0]; i++; } }

補足情報(FW/ツールのバージョンなど)

開発環境:Atollic TrueSTUDIO for ARM 9.0

windowsからだ RS232C通信ではデータ受信は出来ています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TsukubaDepot

2020/01/19 04:53

掲載されたコードだけでは2byte目が受信できない理由が判断できないので、該当するコードをすべて掲載してもらえませんか。 おそらく、根本的な原因は rxbuf[i]=buf3[0]; のbuf3[]の添え字が0固定になってるのが原因のように思えますが。 ちなみに、それ以外にも問題となりそうな記述があります。
kakuwane

2020/01/19 06:38

char buf[]={0x7e,0xff,0x06,0x0f,0x00,0x01,0x01,0xef}; HAL_UART_Transmit(&huart1,(uint8_t*)buf,sizeof(buf),0xffff); char buf2[]={0x7e,0xff,0x06,0x4e,0x00,0x01,0x01,0xef}; HAL_UART_Transmit(&huart1,(uint8_t*)buf2,sizeof(buf2),0xffff); char rxbuf[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; double n=0; /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { n = HAL_UART_Receive(&huart1,(uint8_t *)rxbuf, sizeof(rxbuf), 0xFF); } /* USER CODE END 3 */ WindowsのRS232C通信だと10バイトのデータが返ってくるので 10バイトのデータが欲しくて、色々試してますが よくわからないです。すみません
guest

回答4

0

既に解決済みかもしれませんが、以下で解決するはず。

HAL_UART_Receive(&huart1,(uint8_t *)buf3, sizeof(buf3), 0xF); for(i=0;i<10;i++){ rxbuf[i]=buf3[i]; }

HAL_UART_Receive(...);でハードウェアに保存されているUARTの受信データがbuf3に格納されると考えてください。あとはbuf3内のデータを1文字ずつrxbufにコピーするだけです。

投稿2020/01/22 14:33

編集2020/01/22 14:39
YOshim

総合スコア1085

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私のコメントへのお答えと、他の方とのやりとりを拝見した上でのコメントですが、まずは基本的なC言語の知識を身につけられることをお勧めします。

よくわからないまま、行き当たりばったりであれこれ試行錯誤されても、余計わからなくなるだけだと思います。

投稿2020/01/19 08:46

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakuwane

2020/01/19 15:08

簡単なサンプルでもいいので教えてください
guest

0

そもそも buf3[] をどう定義したのかわかりません。そこを明記してほしいのだけど。
if(i<10){ という判定も意味不明。i はどこに? 10 としたのはなぜ?

y_waiwaiさんがおっしゃるように、
n = HAL_UART_Receive(&huart1,(uint8_t *)buf3, sizeof(buf3), 0xF);
で、n に受信した文字数が返るとすれば、buf3[] 配列に、最大で sizeof(buf3)バイト、つまり配列のサイズ分だけ格納されているはずなので、

n = HAL_UART_Receive(&huart1,(uint8_t *)buf3, sizeof(buf3), 0xF); // n == 2 なら rxbuf[0] = buf3[0]; // 一文字目 rxbuf[1] = buf3[1]; // 二文字目

で受信文字を受け取れる可能性があります。
ただし、最低でも char buf3[2]; とかして、buf3[] を2バイト以上にしておくこと。実際はもう少し大きな配列にするんじゃないかな。

なお、質問のコードは

C

1 if(i<10){ // この i は何? 2 rxbuf[i]=buf3[0]; // 常にbuf3[0] をコピーする 3 i++; 4 }

となっており、ループしても、二文字以上受信できていても、 rxbuf[i] には一文字目しかコピーされませんよ。

投稿2020/01/19 07:25

編集2020/01/19 08:59
rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakuwane

2020/01/19 07:29

WindowsのRS232C通信だと10バイトのデータが返ってくるので 10バイトのデータが欲しくて、色々試してます HAL_UART_Receive(&huart1,(uint8_t *)buf3, sizeof(buf3), 0xF); buf3[] 配列に、最大で sizeof(buf3)バイト  今10バイトの配列を当ててますが リードできてないです。 そもそもリードできるものなのか疑問な状態です
rubato6809

2020/01/19 08:51

buf3 は、どこで、どのように定義していますか?質問のコードに書き加えてください。 一文字は読めているんですよね?それは一文字目として期待通りの文字ですか?
guest

0

その関数(HAL_UART_Receive)の戻り値には、受信できたバイト数が入って返されます
2文字目を読みたいのであれば、その次の文字が受信できるまでその関数を繰り返しましょう。

投稿2020/01/19 03:07

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakuwane

2020/01/19 03:37

2文字目を読みたいのであれば、その次の文字が受信できるまでその関数を繰り返しましょう。 whileで回していますが、それではダメなのでしょうか?
y_waiwai

2020/01/19 03:50

だめです 受信できてないのを1000回まわそうが受信できませんw
y_waiwai

2020/01/19 03:55

戻り値を取得して、それで処理を行う必要があります
kakuwane

2020/01/19 04:33

どうゆうことでしょうか? それが分かってないのですが・・・
kakuwane

2020/01/19 04:40

値を取得してって・・・ HAL_UART_Receiveでは受信できないのでしょうか?
y_waiwai

2020/01/19 04:57

int n= HAL_UART_Receive(なんやかや); で、受信できた文字数(バイト数)がnにはいります。 それを踏まえてコードを書きましょう
kakuwane

2020/01/19 06:21

申し訳ないです。 色々試しているのですが、 intの値が<optimized out>になるので、分からないです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問