Esempio n. 1
0
        public static Boolean Receive(ref ICommunicationInterface ci, out PacketSpinel97 rxPacket, int timeout = 500)
        {
            rxPacket = null;

            byte[] buffer = new byte[1024];                                      // přijímací buffer
            int    index  = 0;
            int    i;

            int      bytesToRead = 0;
            DateTime dt          = DateTime.Now.AddMilliseconds(timeout);        // maximální timeout pro příjem zprávy

            while (DateTime.Now < dt)
            {
                System.Threading.Thread.Sleep(1);
                bytesToRead = (int)ci.BytesToRead();
                if (bytesToRead > 0)
                {
                    Debug.Print(bytesToRead.ToString());
                }
                if ((bytesToRead > 0) && (index + bytesToRead < 1024))
                {
                    index += ci.Read(ref buffer, index, bytesToRead);
                    //Debug.Print(Papouch.Utils.PapUtils.ConvertBinToHex(buffer));
                    i = GetSpinelPacket(ref buffer, index, out rxPacket);        // testujme zda je již přijat kompletní paket
                    if ((rxPacket != null) && (i > 0))
                    {
                        //Debug.Print("packet");
                        return(true);
                    }
                }
            }
            //if (bytesToRead!=0)
            //Debug.Print("timeout");
            return(false);
        }
Esempio n. 2
0
        private void bwListen_DoWork(object sender, DoWorkEventArgs e)
        {
            bwListen_stopped.Reset();

            int            i        = 0;
            int            del      = 0;
            int            len      = 0;
            PacketSpinel97 rxPacket = null;

            int bytesToRead = 0;

            while (!bwListen.CancellationPending)
            {
                if (packets_to_send.Count > 0)
                {
                    SpinelStackRec ssr = packets_to_send.Peek();
                    packets_to_send.Dequeue();

                    byte[] txData = ssr.tx_packet.GetBin();
                    ci.Write(txData, 0, txData.Length);

                    packets_to_receive.Add(ssr);

                    ssr.Sended();
                }

                System.Threading.Thread.Sleep(1);
                bytesToRead = (int)ci.BytesToRead();
                if (bytesToRead > 0)
                {
                    rx_buffer_index += ci.Read(ref rx_buffer, rx_buffer_index, bytesToRead);

                    Debug.Print("{0}/{1}", bytesToRead, rx_buffer_index);

                    i = 0;
                    while ((i + 8 < rx_buffer_index))
                    {
                        del = 0;
                        if ((rx_buffer[i] == 0x2A) && (rx_buffer[i + 1] == 0x61))
                        {
                            len = rx_buffer[i + 2] * 0x100 + rx_buffer[i + 3];

                            del = len + 4 + i;

                            if (del > rx_buffer_index)
                            {
                                break;
                            }

                            byte[] buffer = new byte[del];
                            Array.Copy(rx_buffer, buffer, del);

                            rxPacket = null;
                            Spinel97Utils.GetSpinelPacket(ref buffer, del, out rxPacket);
                            if (rxPacket != null)
                            {
                                Debug.Print(Papouch.Utils.PapUtils.ConvertBinToHex(buffer));
                                PacketReceive(ref rxPacket);
                            }
                        }

                        if (del > 0)
                        {
                            Array.Copy(rx_buffer, del, rx_buffer, 0, rx_buffer_index - del);
                            rx_buffer_index = rx_buffer_index - del;
                        }
                        else
                        {
                            i++;
                        }
                    }
                }
            }
        }