Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

eskalha

Comunicar com dispositivo via Serial Port e fazer gráficos em C#

Mensagens Recomendadas

eskalha

Boa noite,

Estou seriamente encrencado com uma aplicação que tenho que fazer. Estou a usar C#, windows forms, para fazer uma aplicação que comunica com um aparelho via USB com Serial Port e retira informação do aparelho através de comandos pre-definidos a fim de guardar essa informação (valores relativos a voos de aeronaves: temperatura, pressão, rotações por minuto etc) numa base de dados.

O meu problema é que não consigo por a aplicação a comunicar com o aparelho, tenho que usar parâmetros definidos pelo aparelho, como bits de paridade, bits de paragem, etc. Penso que o problema está mesmo no código para fazer a conexão, alguém me ajuda????

Além disso, depois de ter a informação na base de dados, tenho que fazer gráficos de voo (de temperatura, pressao etc) com  esses dados. Há alguma libraria ou excerto de código que me permita fazer gráficos em C#???

Agradecia imenso ajuda nesta aplicação. Podem responder aqui, por PM ou pelo meu e-mail: tdrsoares@hotmail.com

Obrigado desde já,

Tiago Soares

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
M6

eskalha, coloca cada dúvida num post diferente e explica de forma clara e concreta quais são as tuas dúvidas.

Por exemplo, é impossível saber se o problema da ligação série está no teu código sem que o mostres.


10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
apocsantos

    Boa noite,

    A comunicação Serie (RS232) com recurso a um dispositivo conversor USB Série pode apresentar algumas dificuldades, que normalmente são resolvidas a nível de código da aplicação. mostrares o código de comunicação certamente será mais fácil ajudar.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renafi

No que toca aos gráficos, no visual studio 2010 já tens esse componente...


Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eskalha

Ora bem, o meu código para a conexão é este:

private void Connect()
        {
            bool error = false;

            // Se a porta ja está aberta, fecha
            if (serialPort1.IsOpen) serialPort1.Close();
            else
            {
                // configurações da porta
                serialPort1.BaudRate = int.Parse(cmbBaudRate.Text);
                serialPort1.DataBits = int.Parse(cmbDataBits.Text);
                serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
                serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);
                serialPort1.PortName = cmbPortName.Text;
                serialPort1.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cmbFlowCtrl.Text);


                try
                {
                    // abre a porta
                    serialPort1.Open();

                }
                catch (UnauthorizedAccessException) { error = true; }
                catch (IOException) { error = true; }
                catch (ArgumentException) { error = true; }

                if (error) MessageBox.Show(this, "Não foi possível abrir porta COM. Provavelmente não existe ou já está em uso.", "Porta COM não disponível", MessageBoxButtons.OK, MessageBoxIcon.Stop);

            }
            // Muda o estado de controlo do formulario
            EnableControls();

            // Caso a porta tenha sido aberta com as configurações escolhidas, direciona o foco para a textBox de envio de //comandos
            if (serialPort1.IsOpen)
            {
                txtSendData.Focus();

            }
        }

Para a comunicação, no evento onClick de um botao Send, que envia o texto inserido numa textBox do formulario é chamado o método EnviarDados():

 private void EnviarDados()
        {
            if (CurrentDataMode == DataMode.Text)
            {
                // Envia texto para a porta
                serialPort1.Write(txtSendData.Text);

                // Mostra no terminal o texto do user
                Log(LogMsgType.Outgoing, txtSendData.Text + "\n");
            }
            else
            {
                try
                {
                    // converte a string hexadecimal (ex: B4 CA E2) para byte array
                    byte[] data = HexStringToByteArray(txtSendData.Text);

                    // envia dados binarios para a porta
                    serialPort1.Write(data, 0, data.Length);

                    // mostra string hexadecimal no terminal
                    Log(LogMsgType.Outgoing, ByteArrayToHexString(data) + "\n");
                }
                catch (FormatException)
                {
                    // string hexadecimal mal formada
                    Log(LogMsgType.Error, "String hexadecimal mal formada: " + txtSendData.Text + "\n");
                }
            }
            txtSendData.SelectAll();
        }

Agora eu tenho outro método chamado port_DataReceived, que é chamado quando existirem dados no buffer, através da linha:

serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

Agora não sei qual o problema, pk o que eu escrevo na textBox para enviar para a porta aparece no terminal, e ai supostamente devia ser invocado o método port_DataReceived para receber a resposta da porta e coloca-la no terminal também, mas isso não acontece :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Tens a certeza que os parâmetros estão correctos?

Tenta estabelecer ligação através de um SW de terminal, para testares o circuito (usando o mesmo cabo e porta/adaptador).

O método write, não está a lançar nenhuma excepção (faz set ao parametro SerialPort.WriteTimeout para ter a certeza que te lança a excepção caso falhe o envio)? E tens a certeza que os comandos estão a sair correctamente (revê o protocolo, basta as vezes não estar a ser adicionado um caracter de controlo que o dispositivo pode não te responder).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.