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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

1回答

1174閲覧

Raspberry Pi3 の UART 通信について (8bit データを受信したい)

Kuroame112

総合スコア4

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/03/03 11:29

編集2020/03/03 12:02

前提・実現したいこと

Raspberry Pi3 を用いて UART 通信をしようと試みています.
言語は C++ 言語です.
具体的にはセンサから 10 秒ごとに 8 bitのデータが 500 個送られてくるので,その値を表示したいです.
BaudRate は 115200 であり,データビットは 8bit, ストップビットは 1bit です.
Raspberry Pi3 の設定 (UARTの有効化など) は完了しています.

read関数をもちいて該当のソースコードに示すような受信処理のループを作成したのですが,500 個のデータが表示されず,1 個や 2 個といった細切れ状態で表示されてしまいます.
また,表示される値も正確なものでないようです.

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

length: 1 [0]: 255 length: 2 [0]: 253 [1]: 255 length: 1 [0]: 40

該当のソースコード

C++

1//ポートの設定 2#define PORT "/dev/serial0" 3 4//変数宣言 5uint8_t data[500]; 6int length; 7 8//オープン 9fd = open(PORT, O_RDWR); 10 if (fd < 0) { 11 printf("open error\n"); 12 return -1; 13 } 14 15//BaudRate など設定 (追記) 16struct termios tms; 17 18tms.c_cflag += CREAD; 19tms.c_cflag += CLOCAL; 20tms.c_cflag += CS8; 21tms.c_cflag += 0; 22tms.c_cflag += 0; 23 24cfsetispeed(&tms, 115200); 25cfsetospeed(&tms, 115200); 26 27cfmakeraw(&tms); 28tcsetattr(fd, TCSANOW, &tms); 29ioctl(fd, TCSETS, &tms); 30 31 32//受信処理ループ 33while(1) { 34 length = read(fd, data, sizeof(data)); 35 if (0 < length) { 36 printf(“\n length: %d\n”, length); 37 for(i = 0; i < length; i++) { 38 printf("[%d]: %u\n", i, data[i]); 39 } 40 } 41

試したこと

Raspberry Pi3側,センサ側ともに BaudRate を 56700 に変更したところ全く受信できなくなりました.

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

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

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

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

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

y_waiwai

2020/03/03 11:46

コードを省略されては答えようがないです。 全体は提示できませんか
pepperleaf

2020/03/03 12:00

UARTの設定とかどうなってるのでしょう。 また、printf()せずに、500個個分受信するまで、待つとどうなるでしょう。
ozwk

2020/03/03 12:06

「表示される値も正確なものでないよう」とは?何をもって判断したのですか?
Kuroame112

2020/03/03 12:12

y_waiwaiさん コードを追記いたしました. よろしくお願いします. pepperleafさん ソースコードに記載してある部分は上記の通り,追記いたしました. Raspberry Pi3 の設定では /boot/config.txt に "enable_uart=1","dtoverlay=pi3-miniuart-bt" を追記いたしました. printf() をせずに “500 個受信したあとに表示” と変更したところ,センサ側からの 1 回目の送信では受信したデータ数が 500 個に達していないようで,なにも表示されませんでした.
Kuroame112

2020/03/03 12:17

ozwkさん センサ側を Tera Term に接続し値を確認しています. ただ,データ数が 500 個ほどあるため,全ては確認しきれていないのが現状です.
pepperleaf

2020/03/04 11:57

Tera Termで、OKなら、受信側の問題という事ですね。TeraTermの設定と較べてみたでしょうか?
guest

回答1

0

UART通信のデータの単位は1バイトです(まぁ、7bitとか9bitとかもできますが)。1バイト以外ではありません。

2バイト以上のデータの塊をやりとりしたいのなら、その管理はアプリケーション側でやらなきゃいけません。

readをブロック動作にしていないなら
length = read(fd, data, sizeof(data));
に対してsizeof(data)バイトのデータを受信する、という動作を期待してはいけません。これは、この文の実行時点で受け取れるデータを最大sizeof(data)バイトまで、dataの先頭からコピーする(データは受信済みとなる)ものです。実行時点までに受信したデータが数個しかなければそれを受信しただけで文の実行を終わります。
シリアル通信は結構「遅い」ので、単純に受信ループを回しているだけならたまに1バイト受信出来るのがせいぜいでしょう。

あるデータ数をまとめて受信したいのなら

C

1#define LEN 500 2int rcvdSize; 3char data[LEN]; 4 5 while (1) { 6 rcvdSize=0; 7 while (rcvdSize < LEN) { 8 int length = read(fd, data + rcvdSize, LEN - rcvdSize); 9 if (0 < length) { 10 rcvdSize += length; 11 printf("\n rcvd : % d\n", rcvdSize); 12 } 13 } 14 for (int i = 0; i < rcvdSize; i++) { 15 printf("[%d]: %u\n", i, data[i]); 16 } 17 }

とかいうことになると思います(動作未確認、エラー対策等無し)

表示される値も正確なものでないようです

あなたの感想だけを聞いてもなんの判断も出来ません。
どういうデータを送った、受信されるデータはなにを期待している。このプログラムで送信/受信した、実際に受信されたデータはこういうものだった、そういう客観的な事実を記載していただければなにか言えるかも知れません。

投稿2020/03/03 23:38

thkana

総合スコア7639

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

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

pepperleaf

2020/03/04 11:56

> BaudRate は 115200 結構、速いので、表示してたりすると取りこぼしは? とかちょっと気になった。また、フロー制御は?
thkana

2020/03/04 13:45

115200って速いかなぁ... まぁ、PC98で38400bpsの「高速」で取りこぼす拡張ボードとかもあったような気もするけれど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問