eskalha Posted December 28, 2011 at 03:44 AM Report #428776 Posted December 28, 2011 at 03:44 AM 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
M6 Posted December 28, 2011 at 12:15 PM Report #428808 Posted December 28, 2011 at 12:15 PM 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."
apocsantos Posted December 28, 2011 at 06:42 PM Report #428905 Posted December 28, 2011 at 06:42 PM 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"
renafi Posted December 28, 2011 at 08:56 PM Report #428928 Posted December 28, 2011 at 08:56 PM 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
eskalha Posted January 3, 2012 at 04:41 PM Author Report #429874 Posted January 3, 2012 at 04:41 PM 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
Flinger Posted January 9, 2012 at 03:14 PM Report #431085 Posted January 9, 2012 at 03:14 PM 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).
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now