2013-05-24 4 views
0

В настоящее время я работаю над проектом робототехники с Arduino. Я хочу получить доступ к последовательному порту из разных методов в разное время.Как получить доступ к данным последовательного порта из разных методов

Например, я хочу прочитать АЦП в момент времени t1 и получить токи двигателя в момент времени t2. Поэтому я создаю методы readADC() и motorCurrents(), которые должны возвращать int массивы разных размеров. Полученные данные последовательного порта приведены ниже.

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    int n = serialPort1.BytesToRead; 

    serialPort1.Read(data, 0, data.Length); 
} 

Я применил все соответствующие кодировки на стороне Arduino. Я также установил последовательный порт. Мне нужно выполнить следующие команды в C#

private int[] ReadADC() 
{ 
    string input = "AN\n"; // This is the command for reading the ADC on the Wildthumper board. 
    serialPort1.Write(input); 

    // The Wildthumper now sends 11 bytes, the last of which is '*' and the first 
    // 10 bytes are the data that I want. I need to combine two bytes together 
    // from data received and make five values and return it. 
    for (int i = 0; i < 5; i++) 
    { 
     adcValues[i] = data[0 + i * 2] <<8+ data[1 + i * 2]; 
    } 

    return adcValues; 
    // Where data is the bytes received on serial port; 
} 

Аналогично:

private int[] getMotorCurrents() 
    { 
     string input = "MC\n"; // Wildthumper board command 
     serialPort1.Write(input); 

     // The Wildthumper now sends 5 bytes with the last one being '*'. 
     // And the first four bytes are the data that I want. 

     for (int i = 0; i < 2; i++) 
     { 
      MotorCurrents[i] = data[0 + i * 2] <<8 +data[1 + i * 2]; 
     } 

     return MotorCurrents; 
    } 

Прежде всего, количество байтов, отправленных мне изменить. Итак, как я могу использовать глобальную переменную? Для данных (переменная, используемая для хранения последовательных данных, полученных как указано выше)?

+0

Не * никогда * игнорировать возвращаемое значение метода Read(). Это не то, на что вы надеетесь. Серийные порты медленные, вы обычно получаете только 1 или 2 байта. Вместо этого используйте ReadLine(), он блокируется до тех пор, пока не будет получена строка NewLine. Или просто не обрабатывайте данные, пока не получите полный ответ. –

+0

@HansPassant Я действительно не игнорирую значение Read(). Я прочитал все отправленные байты; хотя в некоторых случаях он разбивает 11 байт, отправленных readADC(), как 10 и 1 или 8 и 3 и т. д. –

+0

Вы наверняка проигнорируете это в своем фрагменте. Вы, похоже, хотели что-то сделать с BytesToRead, но тоже отказались от этого. И это происходит не так, как вы описываете, все меньше и остальное в следующем вызове Read(). Не игнорируйте его. –

ответ

0

Вам необходимо создать глобальную переменную и сохранить данные в ней, когда получены данные. Это не сложно.

Вот пример кода:

public class myclass{ 
    public string arduinoData = ""; 

    private void serialPort1_DataReceived(
     object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     this.arduinoData = serialPort1.ReadLine(data, 0, data.Length); 
    } 
    //....The rest of your code, such as main methods, etc... 
} 
Смежные вопросы