2013-12-16 61 views
0

我今天早些時候問過這個問題,但已經完善了我的代碼,所以我在這裏提出了一個新問題。Arduino到C#數據接收

這是我此刻的代碼:

的Arduino代碼:

void setup() 
{ 
pinMode(13,OUTPUT); 
digitalWrite(13,LOW); 

Serial.begin(9600); 
} 

void loop() 
{ 
if(Serial.available() > 0) 
{ 
    char letter = Serial.read(); 

    if (letter == 'A') 
    { 
    digitalWrite(13,HIGH); 
    Serial.println("THE LED IS ON"); 
    } 
    else if (letter == 'B') 
    { 
    digitalWriter(13,LOW); 
    Serial.println("THE LED IS OFF"); 
    } 
} 
} 

我有一個onButton,offButton和textboxInterface C#程序。這是我在C#中的代碼。

C#代碼:(?)

using System.IO.Ports; 

public partial class Form1: Form 
{ 
public static System.IO.Ports.SerialPort serialPort1; 
private delegate void LineReceivedEvent(string line); 

public Form1() 
{ 
    InitizlizeComponent(); 
    System.ComponentModel.IContainer components = new System.ComponentModel.Container(); 
    serialPort1 = new System.IO.Ports.SerialPort(components); 
    serialPort1.PortName = "COM7"; 
    serialPort1.BaudRate = 9600; 
    serialPort1.DtrEnable = true; 
    serialPort1.Open(); 
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 
} 

private static void serialPort1_DataReceived(object sender, SerialDataEventReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 
    textboxInterface.Text = indata; 
} 

我認爲這是基本上是正確的,我得到的唯一錯誤是作爲最後textboxInterface一個錯誤來了說:*的對象引用是必需的非靜態字段,方法或屬性「Arduino_Interface.Form1.textboxInterface」 *

可有人請告訴我我在做什麼傻事......

+0

不要刪除你的問題,然後發佈相同的東西。你有一個編輯按鈕。 –

+0

好的,對不起。我認爲我的代碼中有足夠的變化來拯救它。將來不會做。 –

+0

你的textboxInterface有問題。 嘗試創建一個新的虛擬winform項目,並創建文本框,模擬代碼來訪問其Text屬性,沒有任何這些serialport的東西,將它與您的代碼進行比較,就像您的文本框沒有正確解析(您手寫它?或副本正貼?) – Kelmen

回答

0

首先,從serialPort1_DataReceived的聲明中刪除static。您需要訪問表單的實例字段,因此它不能是static

其次,此事件將在後臺線程上引發,並且無法從該線程更新UI。您將需要編組對UI線程的調用以更新文本框。類似這樣的:

private void serialPort1_DataReceived(object sender, SerialDataEventReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    string indata = sp.ReadExisting(); 
    this.BeginInvoke(new Action(() => textboxInterface.Text = indata)); 
}