Página 1 de 4

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

MensagemEnviado: 15 Nov 2013 09:53
por MOR_AL
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

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

MensagemEnviado: 15 Nov 2013 10:02
por 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.
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.

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

MensagemEnviado: 15 Nov 2013 10:58
por Maffeis
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

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

MensagemEnviado: 15 Nov 2013 11:26
por tcpipchip
Sou cliente deles faz 17 anos
http://www.marshallsoft.com/
Tem o que você quer

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

MensagemEnviado: 15 Nov 2013 11:55
por tcpipchip
Mas cara
Antes de estudar oop...estude os conceitos da analise orientada a objetos

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

MensagemEnviado: 15 Nov 2013 12:33
por andre_luis
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#.


+++

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

MensagemEnviado: 15 Nov 2013 14:10
por Red Neck Guy
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.

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

MensagemEnviado: 15 Nov 2013 15:38
por MOR_AL
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

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

MensagemEnviado: 15 Nov 2013 16:25
por vtrx
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.

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

MensagemEnviado: 15 Nov 2013 16:39
por MOR_AL
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

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

MensagemEnviado: 15 Nov 2013 18:34
por Red Neck Guy
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
    }

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

MensagemEnviado: 15 Nov 2013 18:37
por Red Neck Guy
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:

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

MensagemEnviado: 15 Nov 2013 18:46
por Red Neck Guy
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....
}
...


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

MensagemEnviado: 15 Nov 2013 18:48
por Red Neck Guy
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.

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

MensagemEnviado: 15 Nov 2013 19:08
por vtrx
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.