C# não é fácil!!!

Programação C em geral

Moderadores: 51, guest2003

C# não é fácil!!!

Mensagempor MOR_AL » 15 Nov 2013 09:53

Tudo começou quando quis fazer um sistema no qual poderia comunicar o PC com o uC.
Comprei o curso C# Básico e o C# Avançado. Por sinal ambos são muito bem produzidos, com qualidade, mostrando muitos exemplos e satisfatórios.
Após passar cerca de 50 horas assistindo às vídeo aulas e mais muitas repassando a matéria, ainda assim não me senti qualificado para o meu objetivo.
Apesar das vídeo aulas ensinarem o suficiente, elas não contêm nada sobre comunicação serial.
Passei a pesquisar "Comunicação Serial" via UART na internet.
Em cada 10 acessos sobre o assunto, 9 eram de pedido de auxílio e um sobre alguma explicação incompleta sobre o assunto.
Mesmo com os pedidos de auxílio acrescentando algum código interessante e a explicação, não fui capaz de implementar a comunicação de modo satisfatório.
Apesar dessa linguagem possuir uma excelente IDE, que facilita bastante a edição tanto do código como da Form, ainda assim, por conter muitas possibilidades, ela é extremamente difícil, quando se aventura fora do trivial.

Já estava quase desistindo quando descobri o livro já mencionado em "Índice do fórum ‹ Gerais ‹ Livros".
Com ele pude realizar a tão desejada comunicação entre o PC e o microprocessador. Mas, infelizmente, concluí que o quê o livro apresentava estava além de minhas qualificações. Entendi o que o autor transmitia, mas a linguagem é tão complexa, que a partir de um determinado ponto, praticamente passei a aceitar e copiar.

Concluí, que para possuir o conhecimento necessário para entender do assunto, a ponto de projetar um sistema sozinho, seriam necessárias muitas horas de dedicação profissional dessa linguagem. :?

MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: C# não é fácil!!!

Mensagempor vtrx » 15 Nov 2013 10:02

Vai por mim,se seu intuito é comunicação PC/Microcontrolador,da uma lida sobre Delphi.
Linguagem facil ja 'desmembrada',acesso a todos os perifericos do PC,bilhoes de exemplos,suporte a todos bancos de dados.
Se voce entender o baisco do Delphi,em 1 dias eu te passo uma comunicação enter PIC ->USB->PC ou serial,com firmware em C18 ou ASM Fullspeed.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: C# não é fácil!!!

Mensagempor Maffeis » 15 Nov 2013 10:58

Eu apanhei bastante da serial do C# TB apesar de ter feito o curso on line da microgenios, tb me senti cru pra fazer um sw com qualidade

Chegou um ponto que eu cansei do C# e fui estudar Java, pior bosta que eu fiz

O proximo que eu vou tentar mexer é o Delphi, mas primeiro vou quebrar a cabeça mais um pouco no c# acho que tah faltando pouco pra deslanchar a coisa
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Re: C# não é fácil!!!

Mensagempor tcpipchip » 15 Nov 2013 11:26

Sou cliente deles faz 17 anos
http://www.marshallsoft.com/
Tem o que você quer
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: C# não é fácil!!!

Mensagempor tcpipchip » 15 Nov 2013 11:55

Mas cara
Antes de estudar oop...estude os conceitos da analise orientada a objetos
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: C# não é fácil!!!

Mensagempor andre_luis » 15 Nov 2013 12:33

O problema do C# na minha opinião é que parece ter sido concebido para ser um concorrente do Java.
Como tem muito mais usuários, suporte e exemplos prontos no Java, essa popularização acaba esvaziando um pouco o público do C#.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: C# não é fácil!!!

Mensagempor Red Neck Guy » 15 Nov 2013 14:10

O grande problema aqui é a questão do paradigma da orientação a objetos, pois no final Java,C#, PHP ou qualquer que seja a linguagem, sem conhecer essa metodologia boa parte das bibliotecas padrões parecem estar fazendo coisas bizarras.
Para um programador que vem do paradigma da programação estruturada a orientação a objetos parece ser algo que só te faz perder tempo, pois são vários requisitos que num primeiro momento parecem bobos, mas que são justificados pelo ganho que se tem e pela reutilização de código em outros projetos.
Por exemplo, em C# existe uma classe SerialPort no namespace System.IO , nessa classe existem os métodos writeBuffer e readBuffer, que já são o bastante para implementar qualquer protocolo baseado em interface serial RS232. Então dizer que Java ou C# é melhor do que a outra, no fundo é uma grande bobagem. Java tem seus méritos,já que é extremamente purista em relação a metodologia oo, já C# tem a vantagem de ser criado pelo dono da casa - microsoft, ter suporte para fácil integração de código não gerenciável e possuir algumas implementações de açúcar sintático que deixam os saudosistas em casa.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# não é fácil!!!

Mensagempor MOR_AL » 15 Nov 2013 15:38

vtrx!
Vai por mim,se seu intuito é comunicação PC/Microcontrolador,da uma lida sobre Delphi.
Linguagem facil ja 'desmembrada',acesso a todos os perifericos do PC,bilhoes de exemplos,suporte a todos bancos de dados.

Acredito que o C# também possui todas essas características, talvez com exceção da "fácil já 'desmembrada' ".
Se voce entender o baisco do Delphi,em 1 dias eu te passo uma comunicação enter PIC ->USB->PC ou serial,com firmware em C18 ou ASM Fullspeed.
Há pouco tempo decidi pelo C# porque achei mais conveniente, mas isso pode mudar, apesar de já ter conseguido meu objetivo. De qualquer modo, grato pela disponibilidade do material

Maffeis!
Eu só não gostei das condições do curso, via net, da Microgenios, porque a disponibilidade das vídeo aulas só estão acessíveis por um tempo limitado. Depois, se você quiser rever alguma aula, não pode. Perguntei a eles.
Outro detalhe é que apesar de ter uma internet com 1Mb/s, normalmente obtenho 10 a 20% dessa taxa, o que inviabiliza baixar e assistir as vídeo aulas. Por isso comprei os 2 DVDs sobre C#. Sempre que desejo, eles estão disponíveis. Nem toquei no fato de achar os preços da Microgenios bem salgados!!!
Como comentei antes, o livro é bem completo, nesse aspecto.


Tcpipchip!
Interessante este sítio!
O curso Visual C# Avançado, em vídeo aulas que comprei possui capítulo sobre oop. Veja um resumo dos capítulos e horário de cada assunto importante.

Aula Descrição
....................................................................................................................................................................................
1 Apresentação do treinamento
Papo.
2 Visual Studio 2010 – Avançado
Conceitos do ambiente .NET. Papo.
3 Manipulando Variáveis
Converção de dados. (0h1m0s). Data e hora (0h30m30s). Data e hora. Quadro geral das possibilidades. (0h41m0s). Quadro de Métodos Data e Hora mais importantes. (1h04m0s). String. Trabalhando com Strings. (1h04m30s). Strting. Métodos. (1h13m0s). Invertendo uma String. (1h18m30s). Trim; IndexOf; Substring; Remove; Length (1h37m0s); Data. Iniciar variável. (1h42m30s). String. ToUpper e ToLower (1h44m0s). String. Formatação. (1h45m0s). Funções Matemáticas. Round; SQRT; Max; Min; Seno; Coseno. (1h51m0s).
4 Arrays e Collections
Array – Length; Rank. (0h18m30s). Array – Redimensionar. (0h20m30s). Collection List. (0h27m0s). Collection Sorted List – Add; Clear; ContainsKey; ContainsValue; Remove; RemoveAt; Item; count; capacity; Keys e values. (54m30s). Collection Queue – Clear; Enqueue; Dequeue; Peek e count. (1h0m30s). Collection Stack – Clear; Peek; Push; Pop e count. (1h05m0s).
5 Trabalhando com Formulários – Camadas
Exemplo de criação de forms.VIEW e MODEL, interligando ambas.0h14m0s).
Adicionando Bibliotecas (Rotinas fora dos forms). Interessante quando a rotina criada pode ser útil em outros forms (ou projetos). (0h31m30s).
6 OOP – Orientação a Objetos – Herança (0h16m30s) – Polimorfismo (0h19m0s) – Instância de Classe ou Objeto (0h20m0s) – Encapsulamento (0h33m0s) – Modelos de Camadas (0h37m0s) – Design Pattern (0h43m30s)).

7 Trabalhando com Classes
Criando uma Classe. (0h1m0s). Estrutura hierárquica. (0h33m30s). get e set. Procedimento para se obter (get) ou atribuir (set) uma variável privada (private) de uma classe. (0h48m0s). Boas práticas. Os atributos das classes devem ser “private” e as propriedades devem ser “public”. (0h50m0s). Referenciando Bibliotecas de Classe. (0h52m30s). Statics. (1h08m0s). Exemplo. (1h11m30s). Como documentar as Classes. (1h57m0s).
8 Classes no Visual C#
Classe Base ou Classe Mãe e Classes Derivadas ou Filhas. (0h13m0s). Herança. Como criar uma Classe Base. Formato de uma Classe. Exemplo. (0h13m30s). Como criar uma Classe. Exemplo mais detalhado. Para entender, após um período sem ter estudado, deve-se reestudar a aula 7. (0h26m30s).
Caso não tenha sido já feito, repassar as aulas 7 e 8 para avançar para a aula 9.
9 Classes e Métodos Especiais

10 Gerenciamento de Memória

11 Estruturas e Enum

12 Tratamento de Erros

13 WPF – Windows Presentation Foundation

14 Interfaces Gráficas: Imagens e Gráficos

15 Criação de Jogos e Gráficos

16 Introdução a Banco de Dados

17 Introdução a Linguagem SQL

18 ADO.NET

19 Acessando Banco de Dados com Assistentes

20 Acessando Banco de Dados com Assistentes – Parte 2

21 Acessando Banco de Dados modo Profissional

22 Banco de Dados modo Profissional – Parte 2

23 BD Técnicas Avançadas – LINQ

24 Deploy de uma Aplicação .NET

Dicas:
F12 – Colocando o cursor sobre o nome de uma classe, são apresentadas todas as propriedades, métodos etc.
Ctrl+Shift+B – Compila (a classe) quando não tem (ainda) o form. Cria um arquivo.dll.


André!

Não tenho como avaliar sua afirmação, pois não conheço o Java, mas já estudei o Visual Basic 6 e quando fiz um projeto de cálculo de fonte chaveada, não tive tanta dificuldade assim. Decidi migrar para o Visual C# porque li que o Visual Basic estava morrendo!!!

Aquino!

O grande problema aqui é a questão do paradigma da orientação a objetos, pois no final Java,C#, PHP ou qualquer que seja a linguagem, sem conhecer essa metodologia boa parte das bibliotecas padrões parecem estar fazendo coisas bizarras.
... É... Parecem mesmo. Para mim estão!!!
Para um programador que vem do paradigma da programação estruturada a orientação a objetos parece ser algo que só te faz perder tempo, pois são vários requisitos que num primeiro momento parecem bobos, mas que são justificados pelo ganho que se tem e pela reutilização de código em outros projetos.
Por exemplo, em C# existe uma classe SerialPort no namespace System.IO , nessa classe existem os métodos writeBuffer e readBuffer, que já são o bastante para implementar qualquer protocolo baseado em interface serial RS232. Então dizer que Java ou C# é melhor do que a outra, no fundo é uma grande bobagem. Java tem seus méritos,já que é extremamente purista em relação a metodologia oo, já C# tem a vantagem de ser criado pelo dono da casa - microsoft, ter suporte para fácil integração de código não gerenciável e possuir algumas implementações de açúcar sintático que deixam os saudosistas em casa.

Concordo. Mas sem um comportamento profissional por parte do programador, que frequentemente usa o C#, os cabeçalhos das rotinas/classes mais parecem uma "sopa alfabética de macarrão". Sem contar com os try, catch, delegate, List<string> variável = new List<string>(); ... (object sender, EventArgs e) e outras coisas mais.
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: C# não é fácil!!!

Mensagempor vtrx » 15 Nov 2013 16:25

Acredito que o C# também possui todas essas características, talvez com exceção da "fácil já 'desmembrada' ".
Se voce entender o baisco do Delphi,em 1 dias eu te passo uma comunicação enter PIC ->USB->PC ou serial,com firmware em C18 ou ASM Fullspeed.
Há pouco tempo decidi pelo C# porque achei mais conveniente, mas isso pode mudar, apesar de já ter conseguido meu objetivo. De qualquer modo, grato pela disponibilidade do material

Sem problemas,é que como parece que o intuito é programas direcionados a eletronica,não ví motivo especial em usar C# ou mesmo C para desktop,hoje em dia.
Veja a luta e o tempo que foi ,mesmo com a ajuda do forum aqui,chegar ao objetivo de se comunicar com a serial,que ja esta obsoleto.
Sobre oque eu disse,de 'tudo desmembrado',é só verificar a dificuldade de usar uma dll no c#, e esta dll não é dot net.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: C# não é fácil!!!

Mensagempor MOR_AL » 15 Nov 2013 16:39

vtrx escreveu:
...
Sem problemas,é que como parece que o intuito é programas direcionados a eletronica,não ví motivo especial em usar C# ou mesmo C para desktop,hoje em dia.
Veja a luta e o tempo que foi ,mesmo com a ajuda do forum aqui,chegar ao objetivo de se comunicar com a serial,que ja esta obsoleto.

Ok! Mas na realidade este é um passo intermediário. Estou no capítulo 12 do livro de 14 capítulos. No capítulo 14 o autor trata e mostra a comunicação via USB.

Mas fora este detalhe, me interessou seu último argumento.
Há um software dedicado direcionado para eletrônica?
Qual seria sua sugestão?
MOR_AL
"Para o triunfo do mal só é preciso que os bons homens não façam nada." Edmund Burke.
"Nunca discutas com pessoas estúpidas. Elas irão te arrastar ao nível delas e vencê-lo por possuir mais experiência em ser ignorante". Mark Twain
Avatar do usuário
MOR_AL
Dword
 
Mensagens: 2934
Registrado em: 19 Out 2006 09:38
Localização: Mangaratiba - RJ

Re: C# não é fácil!!!

Mensagempor Red Neck Guy » 15 Nov 2013 18:34

Uma forma simples de fazer:

Código: Selecionar todos
    public class ApusNETv2
    {
        public const byte ETX = 0x02;
        public const UInt16 TIMEOUT_COM=2000;
        private SerialPort comm;

        private ApusNETv2(String porta)
        {
            try
            {
                this.comm = new SerialPort();
                this.comm.PortName = porta;
                this.comm.BaudRate = 9600;
            }
            catch(Exception e)
            {


            }
        }

        public static ApusNETv2 creator(String porta)
        {
            ApusNETv2 novo = new ApusNETv2(porta);
            try
            {
                novo.comm.Open();
                return novo;
            }
            catch(Exception e)
            {
                return null;
            }
        }

        public bool writeApusObject(byte endereco,ApusObject apusObject)
        {           
            byte[] bufferOut = new byte[48];
         
            bufferOut[0] = ETX;
            bufferOut[1] = endereco;
            bufferOut[2] = (byte)ApusNETv2Commands.WRITE_APUS_OBJECT;
            bufferOut[3] = 48;

            serialize(ref bufferOut, 4, apusObject);

            byte[] bufferIn = sendPackge(bufferOut, 46, 6, TIMEOUT_COM);

            if (bufferIn != null)
            {
                if (bufferIn[0] == ETX &&
                   bufferIn[1] == endereco &&
                   bufferIn[2] == (byte)ApusNETv2Commands.WRITE_APUS_OBJECT &&
                   bufferIn[3] == 6 &&
                   CRC16.validaCRC(bufferIn, 4))

                    return true;
            }

            return false;
        }

        public ApusObject readApusObject(byte endereco){

            byte[] bufferOut = new byte[6];

            bufferOut[0] = ETX;
            bufferOut[1] = endereco;
            bufferOut[2] = (byte)ApusNETv2Commands.READ_APUS_OBJECT;
            bufferOut[3] = 6;

            byte[] bufferIn = sendPackge(bufferOut, 4, 48, TIMEOUT_COM);

            if (bufferIn == null)
                return null;

            if(bufferIn.Length==48 &&
               bufferIn[0] == ApusNETv2.ETX &&
               bufferIn[1] == endereco &&
               bufferIn[2] == (byte) ApusNETv2Commands.READ_APUS_OBJECT &&
               bufferIn[3] == bufferIn.Length &&
               CRC16.validaCRC(bufferIn,(byte)(bufferIn.Length-2))){

                   return unSerializa(bufferIn, 4);
            }

            return null;
        }

        /// <summary>
        /// Envia um pacote pelo canal serial e aguarda o recebimento
        /// de dados do dispositivo escravo
        /// </summary>
        /// <param name="buffer">Matriz com os dados </param>
        /// <param name="tamanho">Tamanho dos dados dentro do buffer</param>
        /// <param name="timeOut">Tempo máximo de espera dos dados no canal serial</param>
        /// <returns></returns>
        private byte[] sendPackge(byte[] buffer,byte tamanho,byte esperado,UInt16 timeOut)
        {
            if(comm==null)
                return null;

            CRC16.calculaCRC(buffer,tamanho);
            comm.Write(buffer,0,tamanho+2);
            UInt16 timeOutCounter = (UInt16)(timeOut/10);

            while (comm.BytesToRead != esperado && timeOutCounter-- > 0)
                Thread.Sleep(10);

            if(comm.BytesToRead>0){
                int recebidos = comm.BytesToRead;
                byte[] bufferIn = new byte[recebidos];

                comm.Read(bufferIn,0,recebidos);
                return bufferIn;
            }
            return null;
        }

        #region SERIALIZE

        #endregion
    }
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# não é fácil!!!

Mensagempor Red Neck Guy » 15 Nov 2013 18:37

Explicando o código acima:

Não está sendo utilizada nenhuma bruxaria ou algo do tipo, simplesmente é utilizado o basicão da classe System.IO.SerialPort e da System.Threading.Thread é utilizado apenas o método Sleep que bloqueia a thread por X milisegundos.
Bom, aí alguém diria: "Tá, mas teu código é iterativo e vai deixar minha aplicação travada quando tento comunicar!!!!"

BOm, aí vem o segundo passo:
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# não é fácil!!!

Mensagempor Red Neck Guy » 15 Nov 2013 18:46

Utilizando uma outra thread para implementar a comunicação...
Porém, todas as GUI não permitem que uma thread diferente atualize os dados no formulário da aplicação, sendo assim, é necessário utilizar algum mecanismo implementado pela linguagem para fazer tal coisa. No dotnet, é utilizada o envio de mensagens através da função Invoke
Supondo que existe a classe do formulário que tem possuí o método insereLog(String texto) e esse método insere os dados recebidos em um listbox,digamos, podemos fazer assim:

Código: Selecionar todos
///outros using e tal
using System.Threading;

delegate DLG_insereLog(byte[] vetor);

public class MonitorProtocolo
{
    private Thread monitor;
   private Protocolo protocolo;
   private DLG_insereLog listenerLog;
   
   public MonitorProtocolo(String porta,DLG_insereLog listener){
     this.protocolo = new Protocolo(Porta);
     DLG_insereLog listenerLog = listener;
     
     monitor = new Thread(new ThreadStart(thread));
     monitor.start();
   }

   private void thread_entry(){

     try{
     
       for(;;){
             //          digamos
            byte[] buffer = protocolo.executaAlgumaAcao(lista de parametros....)
            if(buffer !=null){
         
                listenerLog(buffer);
            }
       }
     }
    catch(ThreadAbortException){

    }
   catch(Exception){

    }
   }
}




Lá no teu formulário, seria algo do tipo:

Código: Selecionar todos

....
public void insereLog(byte[] vetor){

   if(Invoke.Required){
       DLG_insereLog dlg = new DLG_insereLog(insereLogAuxiliar);
      Invoke(dlg,new Object[]{vetor});
   }
   else
     insereLog(vetor);
}

private void insereLogAuxiliar(byte[] vetor){
  ....faz alguma coisa com vetor aqui,
   .... nessa função pode acessar os controls do formulário pois já está na mesma thread....
}
...

ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# não é fácil!!!

Mensagempor Red Neck Guy » 15 Nov 2013 18:48

vtrx escreveu:....Sobre oque eu disse,de 'tudo desmembrado',é só verificar a dificuldade de usar uma dll no c#, e esta dll não é dot net."....



É muito fácil utilizar uma DLL não gerenciada no dotnet, base utilizar a clausula DLLImport e pode-se depois criar uma classe de adapter para criar um modelo para utilizá-la de forma elegante.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# não é fácil!!!

Mensagempor vtrx » 15 Nov 2013 19:08

Há um software dedicado direcionado para eletrônica?

Moral,oque eu disse é que tem muito exemplos e componentes direcionados a eletronica pois o Delphi é anterior a C#.
É uma questão de facilidade em escrever um programa, e não de comparação de linguagens.
Vejo uma quantidade enorme de pessoas usando USB CDC por causa disto,oque é muito simples em Delphi,usar USB nativo.
A vantagem em usar C# ou C++ em OS,é escrever programas para Micros(no nosso caso)numa linguagem semelhante(C),eu mesmo uso C++ para programar os aplicativos do Hardware,mas em Delphi é muito mais fácil e rápido.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Próximo

Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x