2017-06-08 56 views
2

私はC#とarduinoで作業しています。私はまだこれについての初心者です。私は誰かが私を助けることができることを望むだから私のプロジェクトはArduinoにいくつかのコードを送ることです。その後、Arduinoに遅延を適用し、C#に文字列/ charを送り返します。私はC#のテキストボックスに読み取り結果を表示しました。 C#コードarduino書き込みと読み込み

Public form1() 
{ 
    initializeComponent(); 
    Serialport1.Open(); 
} 

public void Read() 
{ 
    while (Serialport1.IsOpen) 
    { 
     try 
     { 
      string message = SerialPort1.ReadLine(); 
      textbox1.text = message; 
     } 
     catch (timeoutException) 
     { 
     } 
    } 
} 
private void button1_click(object sender, eventargs e) 
{ 
    SerialPort1.write("A"); 
    read(); 
} 

Arduinoのコード:これは私のコードです

int data; 
void setup() 
{ 
    Serial.begin(9600); 
    Serial.print("START\n"); 
} 

void loop() 
{ 
    if(Serial.available()) 
    { 
     data = Serial.read(); 
     if(data=='A') 
     { 
      delay(3000); 
      Serial.print("B"); 
     } 
    } 
} 

私が望むことはあるテキストボックスの結果の書き込みBが、何も来ず、テキストボックスは空白のままにします。私は何を間違えたのですか?誰かが私に説明できることを願っています。もし

答えて

1

ReadLine感謝するdocumentation

に従って改行値の最初の発生までの入力バッファの内容を返すメソッドです。
....
既定では、ReadLineメソッドは行が受信されるまでブロックします。この動作が望ましくない場合は、ReadTimeoutプロパティをゼロ以外の値に設定して、ポートでラインが使用できない場合にReadLineメソッドがTimeoutExceptionをスローするようにします。

arduinoが送信しているものを見ると、それはただ"B"です。メッセージに改行を追加するか、"B\n"を使用するか、printlnメソッドを使用して自動的に新しい行を追加してください。

しかし、主な問題は実際にはReadのメソッドから返ってくることはないので、GUIは更新されず、何かを受け取っても表示されません。
さらに、whileループでは、データがバッファにあるときだけ読み込むことをお勧めします。あなたはポートから読み取るする価値があるかどうかを確認するBytesToReadプロパティを使用することができます。

while (Serialport1.IsOpen) 
{ 
    if (Serialport1.BytesToRead > 0) 
    { 
     try 
     { 
      string message = Serialport1.ReadLine(); 
      textbox1.text = message; 
      // break out the while loop here so that you can see the content of the textbox 
      break; 
     } 
     catch (Exception ex) 
     { 
      textbox1.text = "ERROR: " + ex.Message; 
     } 
    } 
} 

また、expectionをキャッチするために、この情報を何もしない悪い癖です。非常に頻繁に、エラーの性質を把握することができます。今まであなたはそれをマスキングしています。

0

あなたはこのようなポートにリスナーを添付する必要があります。
SerialPort port = new SerialPort("COM4", 9600); port.DataReceived += new SerialDataReceivedEventHandler(dataReceivedHandler); port.open();

そして、のようなあなたのハンドラを記述します。

private void button1_click(object sender, RoutedEventArgs e) 
    { 
     try {    
      port.Write("A");     
     } 
     catch (Exception ex) 
     { 
      textbox.Text = " Send Failed !"; 
     } 
    } 
:また、あなたのボタンのクリックは、このようなことができ

private void dataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
    { 
     SerialPort sp = (SerialPort)sender; 
     string indata = sp.ReadExisting(); 

     Dispatcher.Invoke(
      delegate 
     { 
      textbox1.Text = indata; 
     }); 
    } 

1

試用:

機能:

  • コンピューター:クリックしてON/OFFボタン
  • アルドゥイーノ:

    const int LedPin = 13; 
    int ledState = 0; 
    
    void setup() 
    { 
        pinMode(LedPin, OUTPUT); 
    
        Serial.begin(9600);  
    } 
    
    void loop() 
    { 
        char receiveVal;  
    
        if(Serial.available() > 0) 
        {   
         receiveVal = Serial.read(); 
    
         if(receiveVal == '1')  
          ledState = 1;  
         else 
          ledState = 0;  
        }  
    
        digitalWrite(LedPin, ledState); 
    
        delay(50);  
    } 
    

    C#コード:

    using System; 
    using System.Windows.Forms; 
    using System.IO.Ports; 
    namespace ledcontrol 
    { 
        public partial class Form1 : Form 
        { 
         SerialPort port; 
         public Form1() 
         { 
          InitializeComponent(); 
          this.FormClosed += new FormClosedEventHandler(Form1_FormClosed); 
          if (port==null) 
          { 
           port = new SerialPort("COM7", 9600);//Set your board COM 
           port.Open(); 
          } 
         } 
         void Form1_FormClosed(object sender,FormClosedEventArgs e) 
         { 
          if(port !=null &&port.IsOpen) 
          { 
           port.Close(); 
          } 
         } 
         private void button1_Click(object sender, EventArgs e) 
         { 
          PortWrite("1"); 
         } 
    
         private void button2_Click(object sender, EventArgs e) 
         { 
          PortWrite("0"); 
         } 
         private void PortWrite(string message) 
         { 
          port.Write(message); 
         } 
        } 
    } 
    

ArduinoのコードをLEDのオン/オフ

あなたはtutoriを見ることができますここに:http://www.lattepanda.com/topic-f6t1534.html?sid=0aac1b4a519c7a2d970b81059e6e581f

関連する問題