Domanda

Voglio comunicare tra il mio PC e alcune schede del controller.

L'aspettativa è che il PC invierà un identificatore della scheda su RS-485 e quindi dovrebbe ricevere la risposta dalla scheda.

Quando provo a ricevere la risposta, ricevo i dati errati.

Ecco il mio codice:

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();
    }
.

funziona se sto usando RS-232, ma non quando sto usando RS-485.

Aggiornamento:

è RS-485 2 Wire. ( http://en.wikipedia.org/wiki/ RS-485 )

È stato utile?

Soluzione

Ho trovato il problema.

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

Read è un metodo di non bloccamento in modo da leggere il buffer ma non attende tutti i byte.Quindi è necessario utilizzare il valore di ritorno di questa funzione che restituisce un numero intero con un numero di byte che potrebbe essere letto.

Sto usando questo:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top