Página 1 de 2

C# Serial Receber Valores

MensagemEnviado: 16 Dez 2012 13:14
por Maffeis
Estou tentando fazer uma comunicação serial entre o pc e o uc com o C#

até então eu estava enviando comando para o uc sem problemas

agora eu preciso que o uc responda

enquanto estava respondendo somente texto tudo certo

utilizava o
Código: Selecionar todos
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)


e
Código: Selecionar todos
InputData = serialPort1.ReadExisting();


mostra em um textbox

Código: Selecionar todos
 textBox1 += InputData;


Agora estou tentando receber o controlador algo mais elaborado (A idéia é chegar em modbus)

estou enviando 5 valores (3 dados + 2 CRC)

estou com dificuldade em achar o fim da msg

tentei usar o Read(byte, offset, length) o serialPort1.BytesToRead

e por exemplo recebia 3 valores dae eu alterava o offset para receber os outros 2

retirei o + quando ia mostrar no text box e percebi que a msg chega em partes
mandava olá mundo e no text box aparecia somente mundo ou undo

vou continuar tentando

alguém teria um norte pra passar?

Obrigado.

MensagemEnviado: 16 Dez 2012 17:45
por KrafT
O ideal é usar delegate para coletar os dados e monitorar o timeout dos pacotes. Assim você acaba com a fragmentação.

Eu não consegui me entender com os delgates, o meu software até coletava os pacotes corretamente, mas o acesso aos dados não ficou bem resolvido e para não utilizar métodos inseguros, desisti do C# ( como já falei em outro tópico) e fiz no Delphi. Era só uma Jiga. Com Jota.

MensagemEnviado: 17 Dez 2012 07:43
por Maffeis
Fiquei muito tempo quebrando a cabeça, deixei pra hoje dae

vou estudar delegate

ontem quando já tava quase rancando os cabelo eu tava vendo alguma de timeout

alterei um parametro mais não mudou nada

Como eu naum sei usar nem o c# e nem o delphi, acho q eu vo continuar com o c# por ser mais parecido com c

obrigado Kraft agora eu tenho um rumo

MensagemEnviado: 17 Dez 2012 08:13
por KrafT

MensagemEnviado: 17 Dez 2012 11:09
por vtrx
Se eu fosse voce ,iria parta o Delphi pois vai perder menos tempo e provavelmente ja tem várias implementaçãoes para ModBus.
Não vale mais a pena ,no PC Side,reinventar códigos.

MensagemEnviado: 17 Dez 2012 11:10
por vtrx
Se eu fosse voce ,iria para o Delphi pois vai perder menos tempo e provavelmente ja tem várias implementaçãoes para ModBus.
Não vale mais a pena ,no PC Side,reinventar códigos.

MensagemEnviado: 17 Dez 2012 11:10
por vtrx
Se eu fosse voce ,iria para o Delphi pois vai perder menos tempo e provavelmente ja tem várias implementaçãoes para ModBus.
Não vale mais a pena ,no PC Side,reinventar códigos.

MensagemEnviado: 17 Dez 2012 13:59
por Maffeis
Gostaria de fazer o modbus e testar em algum CLP ou Inversor de Frequencia que eu tenho aqui na fabrica

Mais para frente eu gostaria de implementar um protocolo próprio

baixei o código que foi sugerido

a leitura ele faz dessa maneira

Código: Selecionar todos
private void GetResponse(ref byte[] response)
        {
            //There is a bug in .Net 2.0 DataReceived Event that prevents people from using this
            //event as an interrupt to handle data (it doesn't fire all of the time).  Therefore
            //we have to use the ReadByte command for a fixed length as it's been shown to be reliable.
            for (int i = 0; i < response.Length; i++)
            {
                response[i] = (byte)(sp.ReadByte());
            }
        }


ele seta o readtimeout para 1000ms

não é muito alto esse valor?

MensagemEnviado: 27 Dez 2012 22:08
por Maffeis
Estou comunicando duas placas (2 lpc1114)
Estou pesquisando sobre thread e delegate
Achei esse site
www.marocatti .net
Gostei dos tutoriais do cara

MensagemEnviado: 28 Dez 2012 00:47
por EvandrPic
Tem alguma coisa errada no seu link..

Maffeis escreveu:Estou comunicando duas placas (2 lpc1114)
Estou pesquisando sobre thread e delegate
Achei esse site
www.marocatti .net
Gostei dos tutoriais do cara

MensagemEnviado: 28 Dez 2012 06:36
por KrafT

MensagemEnviado: 28 Dez 2012 11:12
por Red Neck Guy
Geralmente a fragmentação dos dados ocorre por conta do tamanho do buffer de RX ou pelo um tempo entre os bytes do pacote e tal. Então nem sempre os bytes virão enfileirados certinho.
Eu costumo fazer assim:

Código: Selecionar todos

..
public bool writePackage(byte endereco,byte[] buffer){
byte[] bufferOut = new byte[buffer.length+5]; // 5 é o cabeçalho e o CRC

  bufferOut[0] = endereco;
  bufferOut[1] = 0x01;//a função
  bufferOut[2] = buffer.length;
  for(int i=0;i<buffer.length;i++)
    bufferOut[3+i] = buffer[i];
  UInt16 crc = CRC16.calc(bufferOut,buffer.length+3);
  bufferOut[4+buffer.length] = (byte)(crc>>8);
  bufferOut[5+buffer.length] = (crc&0xFF);

  serial.write(bufferOut,bufferOut.0,length);
  Thread.Sleep(200); // Depende do tempo que o slave leva pra processar

  if(serial.BytesToRead){

    int tamanho = seria.BytesToRead;
    byte[] bufferIn = new byte[tamanho];

    serial.read(bufferIn,0,tamanho);
    //agora trata o buffer ali

     return true;
  }
  return false;
}




Antes da crucificação, o que eu posso dizer sobre a seguinte solução:
- Quando chega no Sleep não é como no delay_ms lá do CCS e tal. Aqui como se trata de um sistema operacional, o que ocorre é que a thread ficará bloqueada por esse tempo e o scheduler utilizará a CPU durante esse tempo apenas com outras threads e processos aptos.

Essa é a solução mais simples e mais confiável em termos de iniciante no mundo do C# e programação Windows. Na verdade a linguagem pouco importa, digamos mais Windows.

Depois que eu comer o que a minha mãe cozinhou, eu posto algo sobre threads, monitores e semáforos

MensagemEnviado: 28 Dez 2012 14:16
por Maffeis
oq eu toh fazendo é o id a função
ai de acordo com a função o tamanho é fixo

um exemplo que eu baixei (indicado aqui pra cima) ele fez algo desse tipo

mais ele fez um for e foi lendo byte a byte

eu ia testar esse cara mais meu conversor sumiu

a mesa tinha o kit o note e ele, naum sei como foi desaparecer ainda

Qual o melhor jeito de eu fazer um timerout

se pegar a msg pela metade se ficar um certo tempo sem receber nada ele der erro

MensagemEnviado: 28 Dez 2012 14:18
por Maffeis
oq eu toh fazendo é o id a função
ai de acordo com a função o tamanho é fixo

um exemplo que eu baixei (indicado aqui pra cima) ele fez algo desse tipo

mais ele fez um for e foi lendo byte a byte

eu ia testar esse cara mais meu conversor sumiu

a mesa tinha o kit o note e ele, naum sei como foi desaparecer ainda

Qual o melhor jeito de eu fazer um timerout

se pegar a msg pela metade se ficar um certo tempo sem receber nada ele der erro

MensagemEnviado: 28 Dez 2012 14:20
por Maffeis
oq eu toh fazendo é o id a função
ai de acordo com a função o tamanho é fixo

um exemplo que eu baixei (indicado aqui pra cima) ele fez algo desse tipo

mais ele fez um for e foi lendo byte a byte

eu ia testar esse cara mais meu conversor sumiu

a mesa tinha o kit o note e ele, naum sei como foi desaparecer ainda

Qual o melhor jeito de eu fazer um timerout

se pegar a msg pela metade se ficar um certo tempo sem receber nada ele der erro