2012-06-17 4 views
0

Мой вопрос: как получить данные из последовательного порта с помощью приложения wpf? Я пробовал много раз, но все еще не могу получить его; Вот идет мой Arduino код:данные, получаемые из последовательного порта через WPF

int switchPin = 7; 
int ledPin = 13; 
boolean lastButton = LOW; 
boolean currentButton = LOW; 
boolean flashLight = LOW; 

void setup() 
{ 
    pinMode(switchPin, INPUT); 
    pinMode(ledPin, OUTPUT); 

    Serial.begin(9600); 
} 

boolean debounce(boolean last) 
{ 
    boolean current = digitalRead(switchPin); 
    if (last != current) 
    { 
    delay(5); 
    current = digitalRead(switchPin); 
    } 
    return current; 
} 

void loop() 
{ 
    currentButton = debounce(lastButton); 
    if (lastButton == LOW && currentButton == HIGH) 
    { 
    Serial.println("UP"); 

    digitalWrite(ledPin, HIGH); 
    } 
    if (lastButton == HIGH && currentButton == LOW) 
    { 
    Serial.println("DOWN"); 

    digitalWrite(ledPin, LOW); 
    } 

    lastButton = currentButton; 
} 

Он посылает сообщения «DOWN» и «UP» при каждом нажатии кнопки. Но как получить его от приложения C#? Пожалуйста, напишите пример такого приложения wpf.

+0

Вы посмотрели класс SerialPort? http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx –

+0

@Erno: Конечно, я это сделал. Просто консольное приложение, и оно не работает с wpf. Существует цикл while (true), и он не будет работать с wpf. – omtcyfz

+0

while (true) петли будут по-прежнему работать в wpf, вам просто нужно знать, куда их поместить. – 3aw5TZetdf

ответ

0

Используйте Backgroundworker, чтобы начать новую тему.

public Form1() 
{ 
    InitializeComponent(); 
    backgroundWorker1.WorkerReportsProgress = true; 
    backgroundWorker1.WorkerSupportsCancellation = true; 
} 

private void startAsyncButton_Click(object sender, EventArgs e) 
{ 
    if (backgroundWorker1.IsBusy != true) 
    { 
     // Prepare the SerialPort here 

     backgroundWorker1.RunWorkerAsync(); 
    } 
} 

private void cancelAsyncButton_Click(object sender, EventArgs e) 
{ 
    if (backgroundWorker1.WorkerSupportsCancellation == true) 
    { 
     // Cancel the asynchronous operation. 
     backgroundWorker1.CancelAsync(); 
    } 
} 

// This event handler is where the time-consuming work is done. 
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    while(!worker.CancellationPending) 
    { 
     string message = _serialPort.ReadLine(); 
     worker.ReportProgress(someValue, message); 
    } 
} 

// This event handler updates the progress. 
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    resultLabel.Text = (e.ProgressPercentage.ToString() + "% " + e.UserState); 
} 

// This event handler deals with the results of the background operation. 
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled == true) 
    { 
     resultLabel.Text = "Canceled!"; 
    } 
    else if (e.Error != null) 
    { 
     resultLabel.Text = "Error: " + e.Error.Message; 
    } 
    else 
    { 
     resultLabel.Text = "Done!"; 
    } 
} 
+0

Хм ... Это ... Windows-формы. – omtcyfz

+0

В этом случае это не имеет значения. –

Смежные вопросы