В настоящее время я работаю над проектом робототехники с 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;
}
Прежде всего, количество байтов, отправленных мне изменить. Итак, как я могу использовать глобальную переменную? Для данных (переменная, используемая для хранения последовательных данных, полученных как указано выше)?
Не * никогда * игнорировать возвращаемое значение метода Read(). Это не то, на что вы надеетесь. Серийные порты медленные, вы обычно получаете только 1 или 2 байта. Вместо этого используйте ReadLine(), он блокируется до тех пор, пока не будет получена строка NewLine. Или просто не обрабатывайте данные, пока не получите полный ответ. –
@HansPassant Я действительно не игнорирую значение Read(). Я прочитал все отправленные байты; хотя в некоторых случаях он разбивает 11 байт, отправленных readADC(), как 10 и 1 или 8 и 3 и т. д. –
Вы наверняка проигнорируете это в своем фрагменте. Вы, похоже, хотели что-то сделать с BytesToRead, но тоже отказались от этого. И это происходит не так, как вы описываете, все меньше и остальное в следующем вызове Read(). Не игнорируйте его. –