NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: C#, náhodný restart arduina při odesílání čísel z formuláře vytvořeném ve WPF.

Aktivity
Avatar
René Češka:29.4.2017 23:59

Ahoj, potřeboval bych poradit. Jsem začátečník v programování a mám problém ,že když posílám čísla do arduina tak se mi v náhodné chvíli restartuje(prostě ty diody co se rosvítli zhasnou)(u seriového monitoru arduina ne). Nevíte kde může být chyba?

Program má na starosti zapínání led-diod na 5x5 maticovém display podle toho jaké tlačítko kliknu v tom programu.(to že to občas nezaznamená číslo ,pokud to nenalezne port tak to spadne nebo že to nemění barvy jak má to budu řešit později. Tenhle problém je ohledně funkčnosti největší a nemůžu ubec přijít ani najít jak to vyřešit).
C#

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace display_změna
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private SerialPort port = new SerialPort("COM3", 9600);



        private void button_Click(object sender, RoutedEventArgs e)
        {

            bool barva = false;
//skontroluje jestli je otevřen port
            if (port.IsOpen == false)
            {
                port.Open();

            }
//pokud je otevřen odešle číslo ,které je v tagu u tlačítka
            if (port.IsOpen == true)
            {
                port.Write(((Button)sender).Tag.ToString());
//uzavře port(funguje s tím i bez toho ,ale někde jsem se dočetl že je to lepší s tím)
                port.Close();
//mění barvu ,ale zpátky už ne(budu řešit později)
                if (barva)
                {
                    ((Button)sender).Background = Brushes.DarkOliveGreen;
                    barva = false;

                }
                else
                {
                    ((Button)sender).Background = Brushes.White;
                    barva = true;
                }
            }

        }


    }
}

Arduino

byte radky[] = {2,3,4,5,6};
byte sloupce[] = {7,8,9,10,11};
int cislo;
int cislo1;
//dvojrozměrné pole pro obrázek
byte obrazek[5][5] = {{0,0,0,0,0},
                      {0,0,0,0,0},
                      {0,0,0,0,0},
                      {0,0,0,0,0},
                      {0,0,0,0,0}};
void setup(){
  Serial.begin(9600);
  for(int i = 0; i < 8; i++){
    //nastaví piny
    pinMode(sloupce[i], OUTPUT);
    pinMode(radky[i], OUTPUT);
    //zajistí vypnutí displeje
    digitalWrite(sloupce[i], HIGH);
    digitalWrite(radky[i], LOW); }
    }
    void loop(){


    //zjistí jestli je v bufferu nějaký znak
if (Serial.available() > 0) {
 cislo = Serial.read()-48;//odečtením 48 to vrátí normální číslo ,které jsem odeslal
      cislo1 =Serial.read()-48;
      Serial.println(cislo);//vypíše číslo ,abych to mohl kontrolovat v seriovém monitoru arduina jak to funguje
      Serial.println(cislo1);
//podle souřadnic najde číslo v poli a přepne ho z 0 na 1 nebo obráceně
   if(obrazek[cislo][cislo1]==1){
     obrazek[cislo][cislo1]=0;
    }else{
     obrazek[cislo][cislo1]=1;
    }

   }else{


      for(int i = 0; i < 5; i++){
        //zapne řádek i
        digitalWrite(radky[i], HIGH);
        //dále pracuje s jednotlivými sloupci
        for(int j = 0; j < 5; j++){
          //pokud je ve vybraném políčku 1, rozsvítí se LED
          if(obrazek[i][j] == 1){ digitalWrite(sloupce[j], LOW); }
          } delay(1);
          //chvíli počká, aby byl obraz dostatečně jasný
          //vypneme všechny sloupce
          for(int j = 0; j < 5; j++){
            digitalWrite(sloupce[j], HIGH); }
            //vypneme řádek i
            digitalWrite(radky[i], LOW); }


   }
}
 
Odpovědět
29.4.2017 23:59
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na René Češka
ostrozan:30.4.2017 9:11

Jako problém bych viděl to, že střídáš na COM portu dvě aplikace-tvoji a monitor arduina - i když nechápu jak to může fungovat. Když otevřeš serial monitor arduina, tak už by tě systém neměl nechat přistoupit na něj z jiné aplikace.
Každopádně bych začal tím, že bych zrušil ty hlášky (Serial.println(­...))l

 
Nahoru Odpovědět
30.4.2017 9:11
Avatar
Odpovídá na ostrozan
René Češka:30.4.2017 11:39

Zapoměl jsem tam napsat, že serial monitor mám vypnutý(nechávám zapnuté jen IDE), když testuju aplikaci a aplikaci mám vypnutou, když testuju přes monitor. Přes monitor se to nerestartuje a přes aplikaci ano. A přes oboje to občas nebere čísla.

 
Nahoru Odpovědět
30.4.2017 11:39
Avatar
René Češka:30.4.2017 12:21

Teď jsem zjistil že se to restartuje i při serial monitoru.

 
Nahoru Odpovědět
30.4.2017 12:21
Avatar
René Češka:30.4.2017 12:26

Ještě jsem si všiml že tam občas skočí -1.

 
Nahoru Odpovědět
30.4.2017 12:26
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na René Češka
ostrozan:30.4.2017 12:32

Tvůj problém je v tom, že za každým přijatým bajtem v arduinu posíláš ty zprávy, takže se to může hádat, buď to zruš nebo to dej jinam

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
30.4.2017 12:32
Avatar
Odpovídá na ostrozan
René Češka:30.4.2017 13:08

Dík funguje to. Sice to celkem často nevezme číslo ,ale to budu řešit až v dalším vlákně pokud na to nepříjdu nebo to nenajdu. Moc děkuju tohle by mě nikdy nenapadlo :).

 
Nahoru Odpovědět
30.4.2017 13:08
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.