Я пытаюсь написать программу на C# для связи с моим Arduino UNO с моего компьютера через последовательное соединение. На данный момент я просто пишу простое приложение, которое устанавливает контакт с Arduino, а затем с несколькими элементами управления для управления каждым булавкой на ардуине; либо прочитайте значение из него, либо напишите ему значение.C# -Ардуино Связь Несоответствие?
Мне удалось установить контакт с Arduino и установить значения pin, но он не всегда хочет подчиняться моим командам. Я установил несколько флажков, и когда я устанавливаю флажок, светодиод должен включаться и выключаться, когда я его проверю. Проблема в том, что иногда светодиоды просто остаются включенными или выключенными, и я должен несколько раз щелкнуть по коробке, прежде чем он снова ответит, или сбросит мою схему ...
Я пытался сделать некоторые сбои, но мог Не попадайте в корень проблемы: это мое приложение или это код Arduino?
Вот соответствующие части моего кода:
private void sendValue(int RW, int _Pin, int Val) //send from my app to serial port
{
if (CommPort.IsOpen)
{
CommPort.WriteLine(RW.ToString() + "," + _Pin.ToString() + "," + Val.ToString());
}
}
private void chP9_CheckedChanged(object sender, EventArgs e) //call the sendValue routine
{
if (chP9.Checked)
{
sendValue(1, 9, 255); //('Write', to pin 9, 'On')
}
else
{
sendValue(1, 9, 0); //('Write', to pin 9, 'Off')
}
}
Это мой C# код, он компилирует строку с разделителями запятыми, чтобы отправить через последовательный порт для чтения с Arduino.
Вот код Arduino:
int RW; //0 to read pin, 1 to write to pin
int PN; //Pin number to read or write
int Val; //Value to write to pin
void setup() {
Serial.begin(38400);
}
void loop() {
ReadIncoming();
ProcessIncoming();
}
void ReadIncoming()
{
if(Serial.available() > 0)
{
RW = Serial.parseInt();
PN = Serial.parseInt();
Val = Serial.parseInt();
}
while(Serial.available() > 0) //Clear the buffer if any data remains after reading
{
Serial.read();
}
}
void ProcessIncoming()
{
if(RW == 0)
{
pinMode(PN, INPUT);
}
else
{
pinMode(PN, OUTPUT);
analogWrite(PN, Val);
}
}
ParseInt просто вынимает первое целое значение, которое она находит, сохраняет его и выбрасывает запятую, и делает это снова и снова, но это кажется немного нелогичным ,
Я думаю, что моя проблема лежит здесь:
while(Serial.available() > 0) //Clear the buffer if any data remains after reading
{
Serial.read();
}
Я думаю, что приложение передает данные быстрее, чем код Arduino может справиться, особенно с этим циклом, но что мне делать с избытком данными?
Я не люблю использовать parseInt, но это единственный способ, который я смог найти, чтобы правильно прочитать мои инструкции. Как отправить массив байтов из C# и прочитать этот массив в массив в Arduino?
Я указал на свои гипотезы и изучил альтернативы, но не смог получить никаких решений. Какие предложения у вас есть для меня?
Нет необходимости передавать строки вокруг, когда несколько байт является то, что вы действительно хотите. –