Może jednak przed opisaniem problemu, wspomnę, co postawiłem sobie za cel. Otóż w zależności od wysłanej z komputera wartości, zaświecić miała się dana ilość diod LED. Całość połączyłem w sposób przedstawiony na tym obrazku.
To niewątpliwie jest zrobione dobrze, gdyż jeśli wartość wysyłam poprzez IDE Arduino, układ działa poprawnie. Pomijając fakt, iż wartość odbierana przez Arduino jest o 48 większa od wysłanej.
Problem pojawia się dopiero w momencie, gdy wartość ma zostać wysłana przez mój program, gdyż najwyraźniej nie jest ona wysyłana.
Kod programu w C++ (Ard.cpp)
- Kod: Zaznacz cały
#include "stdafx.h"
#include <iostream>
using namespace System;
using namespace System::IO::Ports;
int main(array<System::String ^> ^args)
{
String^ odpowiedz;
String^ nazwaPortu;
int predkosc = 57600;
int liczbaDiod = 0;
Console::WriteLine("Podaj nazwe portu, do ktorego podlaczone jest Arduino i wcisnij ENTER");
nazwaPortu = Console::ReadLine();
SerialPort^ arduino;
arduino = gcnew SerialPort(nazwaPortu, predkosc);
try
{
arduino->Open();
do
{
Console::WriteLine("Wpisz, ile diod ma sie swiecic");
std::cin >> liczbaDiod;
if(liczbaDiod<=4)
{
Console::WriteLine("...");
arduino->std::cout << liczbaDiod;
}
else
{
Console::WriteLine("Nie mozna zapalic wiecej, niz 4 diod!");
}
Console::WriteLine("Sprobowac ponownie? t/n");
odpowiedz = Console::ReadLine();
Console::Clear();
}while(String::Compare(odpowiedz, "t")==0);
arduino->Close();
}
return 0;
}
Kod programu dla Arduino (sketch_jan13a.ino)
- Kod: Zaznacz cały
int LED[] = { 10, 11, 12, 13 };
int stan = 0;
void setup()
{
pinMode(LED[0], OUTPUT);
pinMode(LED[1], OUTPUT);
pinMode(LED[2], OUTPUT);
pinMode(LED[3], OUTPUT);
Serial.begin(57600);
}
void loop()
{
if(Serial.available()>0)
{
stan = Serial.read();
stan = stan - 48;
digitalWrite(LED[4], HIGH);
delay(100);
digitalWrite(LED[4], LOW);
if(stan==0)
{
digitalWrite(LED[0], LOW);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
}
if(stan==1)
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], LOW);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
}
if(stan==2)
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], LOW);
digitalWrite(LED[3], LOW);
}
if(stan==3)
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], LOW);
}
if(stan==4)
{
digitalWrite(LED[0], HIGH);
digitalWrite(LED[1], HIGH);
digitalWrite(LED[2], HIGH);
digitalWrite(LED[3], HIGH);
}
}
Serial.println(stan);
delay(1000);
}
Błędu dopatruję się raczej w Ard.cpp, a konkretniej w metodzie wysyłania wartości. Zapewne związany jest on z tym, że wartość wysyłana jest ze zmiennej typu int, a nie ze Stringa. Prawdopodobnie może mieć też na to wpływ użycie cout.
Tak więc pytanie jest następujące. Gdzie w kodzie znajduje się błąd i w jaki sposób go naprawić?



