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

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

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

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

811閲覧

シリアル通信で複数の送信を判別する方法

Merrifield

総合スコア31

C

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

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/06/24 01:49

開発環境は、送信側はC#、Visual Studio 2019 windows フォームアプリケーション(.NET Framework)、受信側はc言語でCube Suite+です。マイコンは78K0R、UART-シリアル変換モジュールはFT232RLを使っています。

パソコンの画面上に3つのTrackBarを表示し、それらをスクロールすることで3色LEDに各色の明るさを制御できるようにしたいと思っています。現時点では、1つの色を制御できるようになっています。TrackBarがスクロールされるたびに、0~100のTrackBarの値をシリアル通信で送信をして、受信側でその値をそのままデューティー比として用いてPWM制御により明るさを制御できるようにしました。これを2色、3色出来るようにしたいのですが、TrackBarを増やして、赤色、青色、緑色それぞれの値を送信するにしても、それをどのように受信側で判別するようにすればよいかわかりません。なにかアイデアを頂けないでしょうか。

送信側のコードを示しておきます。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp6 { public partial class Form1 : Form { public Form1() { InitializeComponent(); mySerialPort.Open(); } private string String; private void Form1_Load(object sender, EventArgs e) { // 最小値、最大値を設定 trackBar1.Minimum = 0; trackBar1.Maximum = 100; // 初期値を設定 trackBar1.Value = 0; // 描画される目盛りの刻みを設定 trackBar1.TickFrequency = 10; // スライダーをキーボードやマウス、 // PageUp,Downキーで動かした場合の移動量設定 trackBar1.SmallChange = 1; trackBar1.LargeChange = 10; // 値が変更された際のイベントハンドラーを追加 trackBar1.ValueChanged += new EventHandler(trackBar1_ValueChanged); } private void trackBar1_Scroll(object sender, EventArgs e) { } private void trackBar1_ValueChanged(object sender, EventArgs e) { // TrackBarの値が変更されたらラベルに表示 label1.Text = trackBar1.Value.ToString(); //TrackBarの値を文字列に変換(2桁) String = trackBar1.Value.ToString("D2"); //送信 mySerialPort.Write(String ); } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { mySerialPort.Close(); } } }

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

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

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

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

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

YAmaGNZ

2020/06/24 01:54 編集

どの値か分かるように識別子をつければいいのではないですか? 例えば最初の1文字目は色を表す、次の3文字は値といった感じで 例)"R001"とか"G100"とか あと、値が100までなのに、なんで2桁で送信しようとしているのでしょう?
episteme

2020/06/24 01:57

さもなくばとにかくRGB全部投げつけるとか、RGBの順で"001085013"みたいに。
Merrifield

2020/06/24 02:02

RやGなどの文字を受信側のc言語で判別する方法はあるのでしょうか?
Merrifield

2020/06/24 02:03

>あと、値が100までなのに、なんで2桁で送信しようとしているのでしょう? 確かに、3桁でよいですね。ありがとうございます。
episteme

2020/06/24 02:05

if ( 受信した文字 == 'R' ) ... とかなんとか
Merrifield

2020/06/24 02:05

>さもなくばとにかくRGB全部投げつけるとか、RGBの順で"001085013"みたいに。 これも、コードの書き方がパッとは思いつかないですが、試してみます。
Merrifield

2020/06/24 02:07

>if ( 受信した文字 == 'R' ) ... とかなんとか それでできるんでしたっけ。ちょっとやってみます
episteme

2020/06/24 02:07

String = trackBar1.Value.ToString("D3") + trackBar2.Value.ToString("D3") + trackBar3.Value.ToString("D3");
Merrifield

2020/06/24 02:08

それでできますね。ありがとうございます
Merrifield

2020/06/24 02:52

受信する側は、receiveという配列で受け取るのですが、上3ケタを数値に変換する場合は、この書き方で問題ないでしょうか? numerical = atoi(receive[0]+receive[1]+receive[2]);
guest

回答1

0

自己解決

YAmaGNZさん、epistemeさんお答えいただきありがとうございました。先頭にR,G,Bを付けることで上手くいきました。

投稿2020/06/24 05:40

Merrifield

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問