Jump to content

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


Recommended Posts

Posted

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

Posted

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."

 

Posted

    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"

Posted

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

Posted

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

Posted

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).

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.