Ejemplo n.º 1
0
 public void Appendでサイズ制限を超えるとContinueが返される(int limit, int size, RecvStatus recvStatus)
 {
     //setUp
     var sut = new Data(limit);
     var expected = recvStatus;
     //exercise
     var actual = sut.Append(new byte[size]);
     //verify
     Assert.That(actual, Is.EqualTo(expected));
 }
Ejemplo n.º 2
0
        [TestCase(0, 2048, RecvStatus.Continue)] //制限なし
        public void Appendでサイズ制限を超えるとContinueが返される(int limit, int size, RecvStatus recvStatus)
        {
            //setUp
            var sut      = new Data(limit);
            var expected = recvStatus;
            //exercise
            var actual = sut.Append(new byte[size]);

            //verify
            Assert.That(actual, Is.EqualTo(expected));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 受信処理
        /// </summary>
        protected void recvTask()
        {
            int bytesToRead = 0;

            switch (recvStatus)
            {
                case RecvStatus.Ready:

                    // バイト数チェック
                    try {
                        bytesToRead = serialPort.BytesToRead;
                        if (bytesToRead < 1)
                        {
                            return;
                        }

                        // ヘッダチェック
                        read(buffer, 0, 1);
                    }
                    catch {
                        ts.TraceInformation("readで例外発生");
                        return;
                    }

                    // 受信ヘッダチェック
                    if (CommandUtil.CheckHeader(buffer) == false)
                    {
                        ts.TraceInformation("受信ヘッダチェック異常");
                        return;
                    }
                    recvStatus = RecvStatus.HeaderReading;
                    break;

                case RecvStatus.HeaderReading :

                    // バイト数チェック
                    try {
                        bytesToRead = serialPort.BytesToRead;
                        if (bytesToRead < 1)
                        {
                            return;
                        }

                        // ヘッダチェック
                        read(buffer, 1, 1);
                    }
                    catch {
                        ts.TraceInformation("readで例外発生");
                        return;
                    }

                    recvStatus = RecvStatus.CommandProcessing;
                    break;

                case RecvStatus.CommandProcessing:
                    // 本文チェック
                    byte bodyLength = buffer[1];
                    try
                    {
                        // 本文の長さ以上のデータが読み込めれば続行する。
                        bytesToRead = serialPort.BytesToRead;
                        if (bytesToRead < bodyLength+2)
                        {
                            return;
                        }

                        // 本文読み込み
                        read(buffer, 2, bodyLength + 2);

                        // コマンドをデコードする
                        byte[] byteImage = new byte[bodyLength + 4];
                        Array.Copy(buffer, byteImage, bodyLength + 4);
                        recvCommand = CommandUtil.decodeCommand(byteImage);

                        // Ackを受信した場合
                        if (recvCommand.Cmd == 'w' ||
                            recvCommand.Cmd == 'r')
                        {
                            // 状態異常時
                            if (sendStatus != SendStatus.AckWaiting) {
                                ts.TraceInformation("AckWaiting以外でAckを受け取ったため無視します。");
                            }
                            // 正常時
                            else {
                                sendStatus = SendStatus.CommandProcessing;
                                sendAckCommand = recvCommand.Clone();
                            }
                        }
                        // Ack以外のコマンドを受信した場合
                        else {
                            // コマンド実行
                            execCommand(recvCommand);

                            // Ackの返信
                            respondAck(recvCommand);
                        }
                    }
                    catch
                    {
                        ts.TraceInformation("コマンド受信異常");
                    }

                    // シーケンスを終了
                    recvStatus = RecvStatus.Ready;
                    break;
            }
        }