C# Dúvidas

Programação C em geral

Moderadores: 51, guest2003

C# Dúvidas

Mensagempor MOR_AL » 02 Ago 2013 10:17

Estou apanhan...ehrr, estudando C#.
Mais precisamente a parte da porta serial.
Descobri muitas propriedades e métodos (que ainda não consegui diferenciar alguns métodos de propriedades) específicas para a porta serial.

Como era de se esperar, tenho muitas dúvidas, mas para poupar vocês, vou apresentá-las em doses homeopáticas. :wink:

1 - Quando eu leio um byte do buffer de recepção, o dado é deletado automaticamente deste buffer, ou eu tenho que apagá-lo?

2 - Se o dado não for deletado automaticamente, qual é a instrução que o faz? Procurei mas não encontrei essa instrução.

3 - Já identifiquei quais portas seriais encontram-se no meu PC. Para usá-las precisaria saber quais estão disponíveis para o uso. Explico melhor. Identifiquei a COM1, mas por exemplo, quando estou conectado com a internet (3G), aparecem outras COM's. Claro que estas não se encontram disponíveis, ou sem uso. O ideal seria saber maiores detalhes sobre as portas. Por exemplo, tem portas seriais mas são para USB, como é o caso do meu modem 3G.
Pergunto. Como identificar (dentro do C#) apenas as portas seriais disponíveis para a comunicação via RS232? Tem algum modo que informe se estão em uso? Tem algum modo que informe maiores detalhes sobre a porta?

Baixei diversas apostilas e até comprei dois DVDs sobre o C# (básico e Avançado). Foram 47 vídeo aulas com cerca de 1h e meia cada. Apesar de ensinar bastante coisa, o foco foi mais para a área comercial.
Baixei também, diversos trabalhos sobre comunicação via porta serial e já comecei a estudá-los, mas "muitos caminhos vão à Roma". Tem diversas maneiras de acessar a porta serial. Ou via usando direto o ícone da porta serial, ou criando uma classe etc.
Quero fazer o básico, porque quero entender o que estou fazendo. Para isso peço o auxílio dos experts com as questões acima.
[]'s
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# Dúvidas

Mensagempor Maffeis » 02 Ago 2013 11:04

Vou ver nos programas q eu fiz (Nenhum funcionou 100%) se quando vc abre uma porta já aberta se ele gera algum tipo de erro

Acredito que sim.

Um dos programas que eu fiz o que funcionou melhor eu usava o readbyte

Gerava a "interrupção" eu via quantos bytes tinha a ser lidos e jogava eles no meu vetor

Eles apagavam sim (mais eu tive problemas de perder valores).
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Re: C# Dúvidas

Mensagempor Red Neck Guy » 02 Ago 2013 11:09

A classe porta serial do dotnet apresenta a propriedade bytesToread que basicamente é um contador que diz quantos bytes estão disponíveis no buffer da uart naquele momento, quando você chamar o método readbytes a quantidade de bytes que for lida nessa chamada será descontada da propriedade bytesToRead.
Dificuldade em entender o que são métodos e o que são propriedades no dotnet? Propriedades sem começam com letra maiuscula, métodos não. Dificuldades pra entender a diferença entre métodos e propriedades? A grosso modo podemos dizer que os métodos são as funções internas das classes e as propriedades são uma forma de mapear externamente o acesso às variáveis da classe. Propriedades que mapeiam os atributos e permite ser chamadas como função não existem em Java e C++ por exemplo.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# Dúvidas

Mensagempor MOR_AL » 02 Ago 2013 14:48

Maffeis!
Mas o programa gera o erro e dá problema na porta que foi tentada abrir, ou ele informa que não pode fazer a tarefa de abrir, porque está ocupada. Entenda que não quero criar o problema.


Coloquei essas instruções no VS para ver quais eu conseguia que não dessem erros. Com algumas eu não descobri a formatação da instrução.
Estou usando o “resource” serialPort1 da ToolBox.
Puts! TODO o código ficou verde!!!

Código: Selecionar todos
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        string String1, LeByteString, LeString, LeStringAteh;
        int bytesALer, bytesATransmitir, offsetx, countx, TamanhoDoBufferEntrada, TempoRegressivo, BytesNoBuffer;
        byte[] TrataByeRecebido, LeByte;
        byte LeByteSinc;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.BaudRate = 1200;
            // Obtém o número de bytes a serem lidos constantes no Buffer de entrada.
            bytesALer = serialPort1.BytesToRead;
            // Obtém o número de bytes a serem transmitidos constantes no Buffer de saída.
            bytesATransmitir = serialPort1.BytesToWrite;
            /* Abrir porta. SEMPRE VEJO O IF. SERÁ QUE ABRIR UMA PORTA JÁ ABERTA CRIA PROBLEMA IMEDIATO?
            PARA QUÊ ESTA PREOCUPAÇÃO?*/
            if (serialPort1.IsOpen){
                serialPort1.Close();
            }
            serialPort1.Close();  // Fechar a porta aberta.
            serialPort1.DataBits = 8;
            // serialPort1.DataReceived +=            NÃO DESCOBRI O FORMATO DA INSTRUÇÃO PARA USAR!!!
            serialPort1.DiscardInBuffer(); // Limpa o Buffer que contém os dados seriais recebidos.
            // serialPort1.DiscardNull                NÃO DESCOBRI O FORMATO DA INSTRUÇÃO PARA USAR!!!
            serialPort1.DiscardOutBuffer(); // Limpa o Buffer que contém os dados seriais a serem transmitidos.
            //serialPort1.Dispose                     NÃO DESCOBRI O FORMATO DA INSTRUÇÃO PARA USAR!!!
            //serialPort1.Disposed                    NÃO DESCOBRI O FORMATO DA INSTRUÇÃO PARA USAR!!!
            serialPort1.Parity = 0;
            serialPort1.PortName = "COM1";
            /* Lê o numero de bytes (countx) do buffer da porta de entrada serial e escreve no array
            (TrataByeRecebido) com o offset (offsetx).*/
            serialPort1.Read( TrataByeRecebido, offsetx, countx);
            serialPort1.ReadBufferSize = 10; // Determina o tamanho do buffer de entrada.
            TamanhoDoBufferEntrada = serialPort1.ReadBufferSize; //// Obtém o tamanho do buffer de entrada.
            //LeByteSinc = serialPort1.ReadByte(); Synchronously reads int]OnEnabledChanged byte from System.IO
            //.SerialPort input Buffer.               NÃO DESCOBRI O SIGNIFICADO!!!
            LeByteString = serialPort1.ReadExisting(); // Lê, imediatamente, todos os bytes disponíveis no buffer
            //de entrada.
            LeString = serialPort1.ReadLine(); // Lê do buffer de entradda, até encontrar o caractere de "new line".
            // Estipula o valor, em milisegundos, do tempo antes de ocorrer um fim de tempo, durante a recepção não terminada.
            serialPort1.ReadTimeout = 6;
            // Obtém o valor, em milisegundos, do tempo antes de ocorrer um fim de tempo, durante a recepção não terminada.
            TempoRegressivo = serialPort1.ReadTimeout;
            //Le a string, do buffer de entrada, até encontrar o valor especificado.
            LeStringAteh = serialPort1.ReadTo("valor da String");
            // Obtém o número de bytes do buffer de entrada, antes de ocorrer um evento de byte recebido.
            BytesNoBuffer = serialPort1.ReceivedBytesThreshold;
            // Estipula o número de bytes do buffer de entrada, antes de ocorrer um evento de byte recebido.
            serialPort1.ReceivedBytesThreshold = 7;
            BytesNoBuffer = serialPort1.BytesToRead;
            // LeByte = serialPort1.ReadByte      NÃO DESCOBRI O FORMATO DA INSTRUÇÃO PARA USAR!!!

        }
    }
}




O que você quis dizer com “Gerava a “interrupção””? Qual evento que dispara essa “interrupção” no C#, quando a porta serial recebe um byte?
"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# Dúvidas

Mensagempor MOR_AL » 02 Ago 2013 15:01

Aquino!
Pois é!
Entendi como usar a propriedade bytesToRead, mas a ReadByte não! Observe a última linha das instruções na postagem anterior. Ela dá erro! :cry:
LeByte é uma variável do tipo byte e esperava que a propriedade ReadByte, na instrução serialPort1.ReadByte fornecesse o byte que se encontra no buffer de entrada da porta serial.

Não vou dizer que entendi perfeitamente a diferença. É um aprendizado e como tal, meus preguiçosos neurônios tem dificuldade de se reagruparem, mas estão se mexendo. :lol:
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# Dúvidas

Mensagempor Maffeis » 02 Ago 2013 15:28

Então eu acho que não é bem interrupção o nome da parada, se não me engano o pessoal costuma chamar Evento

é o serialdatarecived

Quando chega alguma coisa pela serial ele executa aquele trecho de código

Tem o Try cacht então ele tenta abrir a porta se der algum tipo de erro ele executa o cacht que trata as exceptions

Me corrijam se eu estiver falando alguma besteira
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Re: C# Dúvidas

Mensagempor MOR_AL » 02 Ago 2013 16:46

Maffeis escreveu:Então eu acho que não é bem interrupção o nome da parada, se não me engano o pessoal costuma chamar Evento

é o serialdatarecived

Método DataReceived
Represents the method that will handle the data received event of a SerialPort object.
O que significa tratar o evento de recebimento? O que acontece assim que chega um byte? Eu tenho que ficar monitorando, ou o programa desvia para uma rotina?


Quando chega alguma coisa pela serial ele executa aquele trecho de código


LeByteString = serialPort1.ReadExisting(); // Lê, imediatamente, todos os bytes disponíveis no buffer de entrada.
Pensei nesta instrução também. Com ela eu determino o instante da leitura, mas pode ou não estar disponível, ou pode haver mais de um byte enquanto desejaria receber apenas um.

Com o método DataReceived entendo que ao terminar que receber um byte, ou o que estiver estipulado para a quantidade de bytes no buffer de recepção, é gerado um evento em que, em algum local é necessário tratar o(s) byte(s) recebido(s). Acho que é como uma interrupção, que desvia o programa para uma rotina, onde é feito o tratamento do dado recebido. Só não consegui identificar onde e como montar.


Tem o Try cacht então ele tenta abrir a porta se der algum tipo de erro ele executa o cacht que trata as exceptions
Também já observei estas instruções em outros trabalhos. Pretendo utilizá-las depois que resolver o básico, ou seja; considerando que não hajam erros, receber e transmitir um byte pela serial.
Valeu!
MOR_AL


Me corrijam se eu estiver falando alguma besteira
"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# Dúvidas

Mensagempor MOR_AL » 03 Ago 2013 19:56

Olá pessoal!
Depois de apanh ... ehrr ... estudar bastante, consegui enviar um byte (caractere) para a porta serial e recebê-lo de volta. Usei um loop-back. Liguei a saída de dados Tx do conector DB9 na entrada de dados Rx do mesmo conector.
A proeza foi conseguida através de um conversor USB_Serial_USB, já que tinha queimado a minha porta serial COM1.
Tentei fazer apenas estudando C#, mas o foco das vídeo aulas era para a parte financeira e não tinha praticamente nada sobre porta serial. Não coloco a culpa nas vídeo aulas, que por sinal são bem detalhadas, o caso é que Visual C# tem tanta coisa, que eu mal arranhei a pele do bichão.
Depois de pesquisar e estudar uns 50 sítios na internet com a pesquisa em torno de "Visual C# serial port" e outra pesquisas correlatas também em português, selecionei duas que foram decisivas.
A primeira tem um passo-a-passo de como fazer a "solution" no Visual Studio C#. Simplesmente "lí-consegui-entender-copiei-e-colei".
Dei uma lida no código e este me pareceu o menos complicado. Cheguei até a entender quase todas as instruções, mesmo porque a explicação do sujeito é muito boa.
O legal é que já estava preparando um programa para tal, porém queria incluir maiores detalhes. Vou estudar o código TODO até entender tudo. Somente assim se aprende.
Se alguém quiser pular muitas horas de pesquisa sobre o assunto, aqui vai o endereço do sítio:
http://csharp.simpleserial.com/
Quanto ao outro sítio, é até de um cara brasileiro. Ainda não entrei em detalhes, mas parece que ele leu o conteúdo do sítio apresentado aqui. Não tenho certeza.
Estou organizando minhas pesquisas para poder filtrá-las e deixar organizadas para o meu trabalho com a porta serial.
Bons projetos.
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# Dúvidas

Mensagempor RobL » 05 Ago 2013 17:09

Pesquise sobre o fato das portas seriais tradicionais, nos atuais Windows (acho que desde o NT e seus derivados), serem bloqueadas, acesso somente como root. Daí a possível dificuldade de se comunicar com uma porta serial do seu hardware, visto que as virtuais (USB serial), são softwares que simulam uma porta serial (USB CDC).
Já as portas virtuais, tal como serial USB, essas dão acesso normal.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: C# Dúvidas

Mensagempor Red Neck Guy » 05 Ago 2013 19:02

RobL escreveu:Pesquise sobre o fato das portas seriais tradicionais, nos atuais Windows (acho que desde o NT e seus derivados), serem bloqueadas, acesso somente como root. Daí a possível dificuldade de se comunicar com uma porta serial do seu hardware, visto que as virtuais (USB serial), são softwares que simulam uma porta serial (USB CDC).
Já as portas virtuais, tal como serial USB, essas dão acesso normal.


O dotnet disponibiliza uma classe que acessa as portas seriais sem a necessidade de permissão especial.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Re: C# Dúvidas

Mensagempor vtrx » 05 Ago 2013 22:57

Portas COM não precisam de permissão.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Re: C# Dúvidas

Mensagempor RobL » 06 Ago 2013 10:08

Não sei se estamos falando do mesmo objeto.
Nas versões derivadas do NT e outras, como XP, vista, win7, etc, o acesso direto ao hardware da porta serial, não se faz da mesma forma que no win98 para trás, no qual se acessava diretamente a porta (hardware no seu endereço).
Por segurança, esse método direto foi "bloqueado". O acesso passa a ser feito através de drives. Portanto os programas antigos que acessavam diretamente o endereço de uma porta serial, não conseguem funcionar. Como exemplo, há um executável, dentre outros, giveio.exe, que instala um serviço no XP e passa a permitir o acesso direto ao hardware para usuário.
Pode ser que algum usuário tenha acessado uma porta Com "diretamente", nos novos windows, sem notar que havia um drive instalado para tal.

Conforme o Aquino colocou, há uma classe, no C#, na qual os métodos acessam as portas seriais sem necessidade de permissão de root. Certamente um desses métodos estabelece um serviço ou outra forma e permite o acesso à porta.
Bom, nada saco de grandes Os.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Re: C# Dúvidas

Mensagempor vtrx » 06 Ago 2013 14:12

Completando.
A serial pode ser acessado normalmente,a restrição é com o sinal DTR da serial e a porta paralela.
Aplicações simples com a serial geralmente não utilizam o sinal DTR,que antigamente era uma das fontes de 12v para circuitos com pouquissimo consumo.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01


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

Quem está online

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

x