2013-10-05 7 views
1

Я пытаюсь написать программу на 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?

Я указал на свои гипотезы и изучил альтернативы, но не смог получить никаких решений. Какие предложения у вас есть для меня?

+0

Нет необходимости передавать строки вокруг, когда несколько байт является то, что вы действительно хотите. –

ответ

2

Мне не ясно, почему это работает вообще. Вы должны рассмотреть более разумный способ кодирования команды. Вам нужно только три байта:

private void sendValue(int RW, int _Pin, int Val) { 
     var cmd = new byte[] { (byte)RW, (byte)_Pin, (byte)Val }; 
     ComPort.Write(cmd, 0, cmd.Length); 
    } 

Тогда вам просто нужно прочитать эти 3 байта на Arduino конце:

void ReadIncoming() { 
    if (Serial.available() >= 3) { 
     RW = Serial.read(); 
     PN = Serial.read(); 
     Val = Serial.read(); 
     ProcessIncoming(); 
    } 
} 
+0

Привет, Ханс, это работает как шарм, спасибо! Это то, что я искал, прежде чем попробовал parseInt. Я сделал что-то подобное, но написал: if (Serial.available()> ** 0 **) и что, как я подозревал, прочитал данные до того, как все байты присутствуют, поэтому он вообще не работает. –

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