Pergunta

Quero me comunicar entre meu PC e algumas placas controladoras.

A expectativa é que o PC envie um identificador da placa no RS-485 e então receba a resposta da placa.

Quando tento receber a resposta, recebo os dados errados.

Aqui está o meu código:

public void set()
    {

        SerialPort sp = new SerialPort("COM1");
        sp.Open();
        if (sp.IsOpen)
        {
            byte[] id = new byte[]{0,0,0,0,0,0,0,0,0,0};
            byte[] rec = new byte[540];
            while (!end)
            {
                sp.Write(id,0,id.Length);

                sp.Read(rec,0,rec.Length);

                //do some with rec
                //WORKING
                //do soem with rec

            }
        }
        sp.Close();
    }

Funciona se eu estiver usando RS-232, mas não quando estiver usando RS-485.

ATUALIZAR :

É RS-485 2 fios.(http://en.wikipedia.org/wiki/RS-485)

Foi útil?

Solução

Eu encontrei o problema.

 sp.Read(rec,0,rec.Length);

Read é um método sem bloqueio, portanto lê o buffer, mas não espera por todos os bytes.Então você precisa usar o valor de retorno desta função que retorna um número inteiro com um número de bytes que ela pode ler.

Estou usando isso:

int read = 0;
int shouldRead = readData1.Length;
int len;
while (read < shouldRead )
{
    len = serialport.Read(buffer, 0, readData1.Length);
    if (len == 0)
         continue;
    Array.Copy(buffer, 0, readData1, read, len);
    read += len;
    Thread.Sleep(20);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top