C# Serial Receber Valores

Programação C em geral

Moderadores: 51, guest2003

C# Serial Receber Valores

Mensagempor Maffeis » 16 Dez 2012 13:14

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.
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Mensagempor KrafT » 16 Dez 2012 17:45

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.
"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor Maffeis » 17 Dez 2012 07:43

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
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Mensagempor KrafT » 17 Dez 2012 08:13

"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor vtrx » 17 Dez 2012 11:09

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor vtrx » 17 Dez 2012 11:10

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor vtrx » 17 Dez 2012 11:10

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.
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor Maffeis » 17 Dez 2012 13:59

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?
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Mensagempor Maffeis » 27 Dez 2012 22:08

Estou comunicando duas placas (2 lpc1114)
Estou pesquisando sobre thread e delegate
Achei esse site
www.marocatti .net
Gostei dos tutoriais do cara
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Mensagempor EvandrPic » 28 Dez 2012 00:47

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
EvandrPic
Dword
 
Mensagens: 2116
Registrado em: 31 Mar 2010 15:05

Mensagempor KrafT » 28 Dez 2012 06:36

"..."Come to the edge," he said. And so they came. And he pushed them. And they flew."― Guillaume Apollinaire
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Mensagempor Red Neck Guy » 28 Dez 2012 11:12

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
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor Maffeis » 28 Dez 2012 14:16

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
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Mensagempor Maffeis » 28 Dez 2012 14:18

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
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Mensagempor Maffeis » 28 Dez 2012 14:20

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
Maffeis
Word
 
Mensagens: 501
Registrado em: 07 Ago 2010 19:10

Próximo

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

Quem está online

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

cron

x