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

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

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

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

2回答

1767閲覧

Serial.printの挙動

isaka

総合スコア12

C#

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

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/09/26 13:15

C#のフォームアプリケーションとArduinoでシリアル通信を行っています。
1.フォームアプリケーションから情報を送信する
2.サーボモータを動かす
3.動かした後の角度の情報をフォームアプリケーションで表示する
上記のことを行いたいのですが、
フォームアプリケーションで表示する情報が途切れています。
(想定:1500、実際:15、など)
フォームアプリケーションで情報を受け取った際には既に途切れているので、
スケッチに問題があると考えているのですが特定できません。

どなたかご指導をお願いいたします。

Form1.cs

1namespace KakudoCheck 2{ 3 public partial class Form1 : Form 4 { 5 private string data; 6 7 public Form1() 8 { 9 InitializeComponent(); 10 } 11 12 private void Form1_Load(object sender, EventArgs e) 13 { 14 serialPort1.Open(); 15 } 16 17 private void button1_Click(object sender, EventArgs e) 18 { 19 serialPort1.Write("A"); 20 // ボタンを押した直後、利用不能にしておく 21 button1.Enabled = false; 22 } 23 24 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 25 { 26 try 27 { 28 // ポートから文字列を受信する 29 data = serialPort1.ReadExisting(); 30 31 if (!string.IsNullOrEmpty(data)) 32 { 33 // 受信用スレッドから切り替えてデータを書き込む 34 Invoke((MethodInvoker)(() => 35 { 36 Thread.Sleep(1000); 37 38 label1.Text = "servo1の角度:" + data; 39 40 41 })); 42 } 43 } 44 catch (Exception ex) 45 { 46 MessageBox.Show(ex.Message); 47 } 48 } 49 } 50}

kakudo.ino

1#include <VarSpeedServo.h> 2 3VarSpeedServo servo1; 4 5void setup() { 6 servo1.attach(8); 7 Serial.begin(9600); 8} 9 10void loop() { 11 if(Serial.available() > 0){ 12 int inByte = Serial.read(); // データを読み込む 13 14 // Aの場合 15 if(inByte==65){ 16 int angle = servo1.readMicroseconds(); 17 angle = angle - 1; 18 servo1.writeMicroseconds(angle); 19 servo1.wait(); 20 Serial.print(servo1.readMicroseconds()); 21 Serial.flush(); 22 } 23 } 24}

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

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

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

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

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

guest

回答2

0

例えば、送信側はきちんと文字列を送っている、としても、
受信側は、とにかく受信操作した時点で受信した文字列を持って戻ってきます
これがたまたま想定された文字列の送信終了のタイミングにあっていれば、想定通りの受信文字列となりますが、そんな都合よく物事は動いてくれません。

なので、何らかの方法で、一つのメッセージの送信終了、というのを受信側に伝える必要があります

#たとえば、終了文字として、"\n"を送るとか

投稿2018/09/26 13:31

y_waiwai

総合スコア87719

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

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

isaka

2018/09/27 14:32

シリアルポートを複数用意して、 角度の情報を受け取るためのシリアルポートと、 終了文字を受け取るためのシリアルポートを用意する、 ということでしょうか。 あまりイメージができておらず申し訳ありません。
y_waiwai

2018/09/29 09:06

ちがいます 一つのメッセージの終了符号として\n、あるいは\r\n を送ります 受信側は、その終了符号が受信されるまでバッファに受信データを貯めておいて、その終了符号が受信された時点で溜まった受信データをひとまとまりの受信データとして処理します #まあ、ReadLineを使えばいいんだけど
guest

0

serialPort1_DataReceivedイベントのタイミングでは、まだデータを受信途中だからだと思います。
ReadExisting()ではなく、ReadLine()か、ReadTo()を使用してください。
ReadLine()か、ReadTo()を使用する場合は、必ずReadTimeoutを設定しましょう。

投稿2018/09/27 05:54

hillacken

総合スコア359

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問