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!
Avatar
Vojtěch Hartan:15.11.2017 19:17

Zdravím, řeším problém, kde musím zadat do Visual Studia číslo, to pak přes serial port poslat do MCU a pomocí AVR (assembler) to zobrazit na display. Nyní řeším C# kód, chtěl bych se zeptat, jestli byste mi mohli říct, zda to je takto napsané správně. Popřípadě, je tu někdo kdo by uměl poradit i s assemblerem? Děkuji.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;


namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string a;
        private void button1_Click(object sender, EventArgs e)
        {


            SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
            textBox1.Text = a;

            if (a == "0")
            {
                int b = 0b00000000;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }

             else if (a == "1")
            {
                int b = 0b00000001;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }

            else if (a == "2")
            {
                int b = 0b00000010;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "3")
            {
                int b = 0b00000011;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "4")
            {
                int b = 0b00000100;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "5")
            {
                int b = 0b00000101;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "6")
            {
                int b = 0b00000110;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "7")
            {
                int b = 0b00000111;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "8")
            {
                int b = 0b0001000;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
            else if (a == "9")
            {
                int b = 0b0001001;
                string c;
                c = b.ToString();

                port.Open();
                port.Write(c);
                port.Close();
                textBox1.Clear();
            }
        }
    }
}
 
Odpovědět
15.11.2017 19:17
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Vojtěch Hartan
David Hartinger:15.11.2017 19:42

To ti nepřišlo divné zkopírovat 10x to samé pod sebe? Podívej se na princip DRY - https://www.itnetwork.cz/…vrh-softwaru

Nahoru Odpovědět
15.11.2017 19:42
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Marian Benčat:16.11.2017 18:51

mně přijde zajímavější todle:
int b = 0b00000111; // 7
int b = 0b0001000; // 8
int b = 0b0001001; // 9

to je úplně super legendární, dal bych to do síně slávy.. jako další krok navrhuji nastavit konstantu pomocí výpočtu určitého integrálu!

Nahoru Odpovědět
16.11.2017 18:51
Totalitní admini..
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Marian Benčat
Jan Vargovský:16.11.2017 19:13

Zapomněl si na ten další kód:
string c;
c = b.ToString();
port.Write(c);

 
Nahoru Odpovědět
16.11.2017 19:13
Avatar
Odpovídá na Vojtěch Hartan
Michal Štěpánek:16.11.2017 19:14

A zkoušel sis to spustit? Nenafackoval ti ten program? Neukazuje ti chybu VS už při psaní toho kódu?
Proč máš proměnnou

string a;

, která podle všeho může nabývat jen číselných hodnot a proměnnou

int b;

, do které se mermomocí snažíš nacpat písmenka?
A ta proměnná "c" je k čemu?

Editováno 16.11.2017 19:16
Nahoru Odpovědět
16.11.2017 19:14
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jaroslav
Člen
Avatar
Odpovídá na Vojtěch Hartan
Jaroslav:17.11.2017 9:21

No ale takhle vobráceně?

textBox1.Text = a;
 
Nahoru Odpovědět
17.11.2017 9:21
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na David Hartinger
ostrozan:17.11.2017 13:16

to už vypadá,že sis to snad objednal jako exemplární příklad STUPID practice :)

 
Nahoru Odpovědět
17.11.2017 13:16
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Vojtěch Hartan
ostrozan:17.11.2017 13:55

Já nebudu tak "krutý" jako ostatní - protože si asi neuvědomují že o programování nemáš ani šajn a pravděpodobně jsi to dostal za úkol (oprav mně jestli se mýlím).
Pokud to ovšem není nějaký vtip a ty čekáš kdo se chytí.

Že to kompletně celé špatně už víš.

Tak jen přidám to jak by to mělo vypadat správně

  private void button1_Click(object sender, EventArgs e)
        {
        SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
        port.Open();
        port.Write(textBox1.Text);
        port.Close();
        textBox1.Clear();
}

Zamysli se - proč převádět v aplikaci text na číslo , pak zpět na text, který teprve pošleš - není lepší ho poslat zrovna ?
Můj příklad dělá to co potřebuješ, ale je spíš ilustrační - ve skutečnosti bys měl ověřit že jsi opravdu na port připojený,zpracovat nějaké potvrzení od mikrokontroleru o příjmu zprávy, nějakou validaci vstupu - teda, že v textBoxu někdo nezadá nic jiného než číslice 0-9 - o což ses zjevně ve svém řešení snažil, ale existují mnohem elegantnější řešení - třeba místo textBoxu použití kontrolky NumericUpDown s max. hodnotou 9 apod.

Co se týče toho AVRka - proč asembler, když tak bojuješ i s proti němu "user friendly" Céčkem?
Proč ne právě to C ?

 
Nahoru Odpovědět
17.11.2017 13:55
Avatar
Odpovídá na ostrozan
Michal Štěpánek:17.11.2017 18:41

No, jako úplný začátečník bych se rozhodně nepouštěl rovnou do práce s porty. A jestli to dostal za úkol, tak se určitě něco o tom učili a aspoň trochu by měl vědět, co má dělat...

Nahoru Odpovědět
17.11.2017 18:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Vojtěch Hartan:18.11.2017 13:43

Moc se omlouvám, že jsem to takhle předhodil, ale v tu chvíli jsem nevěděl kde mám zrovna hlavu. Byl jsem v tom ponořený až moc, že mi mozek ty chyby úplně přehlížel . Jak jsem to původně zamýšlel bylo - do textboxu se něco zadá (zatím jsem to dělal 0-9 ale pak přidám ještě nějaká písmena), k tomu co se zadá je přiřazena 8 bitová hodnota (zdálo se mi, že to bude jednodušší na přesun a pro následující práci v AVR, ale jestli máte nějaký lepší nápad prosím navrhněte). Tu 8 bitovou hodnotu pošlu na port, kde by to měl přečíst mikrokontroler (nějakým způsobem musím nastavit UART), tu 8 bitovou hodnotu musím dostat z UART do registru, kde pak budu pomocí cpi porovnávat (jestli se ta hodnota shoduje -> jmp na zobrazení té konkrétní hodnoty). Proto jsem potřeboval ten kód na port v C#, abych měl jistotu, že to něco posílá a pak se prát s AVR.

Odpověď na dotazy:

  • Ano musím používat Assembler (je to školní úloha), stejně jako musím používat Atmega 128 a taky AVR studio 4.
  • Ne s portem jsem nikdy nepracoval, ani nám o něm nikdo nic neříkal. Naposledy jsem v C# dělal formovou aplikaci pro kalkulačku (+-*/!cossin).
 
Nahoru Odpovědět
18.11.2017 13:43
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Vojtěch Hartan
ostrozan:19.11.2017 7:09

Podle tvojeho popisu to vypadá že soutěžíte o to, kdo jednoduché zadání "pošli text z textBoxu do mikrokontoléru a zobraz ho na displeji" napíše nejsložitější a na nejvíc řádků :)
Takže trochu základů :
znakům nemusíš přiřazovat binární hodnoty - zápis '0', 0x30 a 0b00110000 jedno jest - v paměťové buňce to vždy bude stejná série jedniček a nul, kterou ti serial port odešle na mikrokontolér, ve kterém ho tak jak je přijat přepošleš na displej - co tam chceš ještě porovnávat?
Jinak konkrétně s asemblerem ti moc neporadím, ale na síti je určitě spousta hotových řešení.

 
Nahoru Odpovědět
19.11.2017 7:09
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 11 zpráv z 11.