//--------------------------------------------------
        // POS接続モードチェック
        //--------------------------------------------------
        private void POSModeCheck()
        {
            try
            {
                CardMachineErrorClass Res = null;

                // バージョン情報取得
                RmGetVersionParamClass VersionParam = new RmGetVersionParamClass();
                Res = RmGetVersion(VersionParam);
                if (Res.ErrorCode != 0)
                {
                    throw new Exception(Res.ErrorMessage);
                }

                // ステータス情報取得
                RmGetStatusParamClass StatusParam = new RmGetStatusParamClass();
                Res = RmGetStatus(StatusParam);
                if (Res.ErrorCode != 0)
                {
                    throw new Exception(Res.ErrorMessage);
                }

                // POS接続モードチェック
                if (VersionParam.reserve2 != 2 || StatusParam.mvmode != 0)
                {
                    // POS接続モードではないのでエラー出力
                    throw new Exception("カード機がPOS接続モードではありません。\nカード機本体の設定を確認してください。");
                }
            }
            catch
            {
                throw;
            }
        }
        /// <summary>
        /// 監視モード時の応答割り振り
        /// </summary>
        /// <param name="order">OrderCardMachineClass</param>
        /// <param name="ret">CardMachineErrorClass</param>
        private void MonitoringEventReturn(OrderCardMachineClass order, CardMachineErrorClass ret)
        {
            try
            {
                RmGetStatusParamClass Data = (RmGetStatusParamClass)order.Param;

                // 監視している場合は特殊応答
                if (OldRWStatus == 0 && Data.rwsStatus == 1)
                {
                    // 未挿入から処理中
                    NotInserted_To_Processing?.Invoke(Data);
                }
                else if (OldRWStatus == 1 && Data.rwsStatus == 2)
                {
                    // 処理中から抜き取り待ち
                    Processing_To_PullWait?.Invoke(Data);
                }
                else if (OldRWStatus == 2 && Data.rwsStatus == 0)
                {
                    // 抜取り待ちから未挿入
                    PullWait_To_NotInserted?.Invoke(Data);
                }
                else if (OldRWStatus == 1 && Data.rwsStatus == 0)
                {
                    // 処理中から未挿入
                    Processing_To_NotInserted?.Invoke(Data);
                }
                else if (OldRWStatus == 0 && Data.rwsStatus == 2)
                {
                    // 未挿入から抜き取り待ち
                    NotInserted_To_PullWait?.Invoke(Data);
                }

                // 最新ステータスを保持
                OldRWStatus = Data.rwsStatus;
            }
            catch
            {
                throw;
            }
        }
        private bool ComPortTest()
        {
            try
            {
                CardMachineErrorClass OpenRet = ErrorCodeCheck(-1);

                // 取得ポートをオープンテスト
                OpenRet = OpenPort(ComPort);

                // 成否判定
                if (OpenRet.ErrorCode != 0)
                {
                    return(false);
                }
            }
            catch
            {
                throw;
            }

            return(true);
        }
        //--------------------------------------------------
        // コムポート設定系
        //--------------------------------------------------
        #region コムポート設定系
        /// <summary>
        /// コムポートをスキャンして自動で設定する
        /// </summary>
        private void ComPortScan()
        {
            try
            {
                // COMポートリストを取得
                string[] ports = SerialPort.GetPortNames();

                // 現在取得したポート数
                int PortsLength = ports.Length;

                if (PortsLength == 0)
                {
                    throw new Exception("COMポートが見つかりません、USBケーブルが繋がっていることを確認してください。");
                }

                // 数字のみ抜き出すための正規表現
                Regex re = new Regex(@"[^0-9]");

                // 上記リストから数字のみ抜き出す
                string[] portnolist = new string[PortsLength];
                for (int i = 0; i < PortsLength; i++)
                {
                    // COMポート名からポート番号を抜き出す
                    portnolist[i] = re.Replace(ports[i], "");
                }

                // ボーレート取得(デバイスのデフォルト値)
                SerialPort[] PortNames = new SerialPort[PortsLength];
                int[]        baudList  = new int[PortsLength];
                for (int i = 0; i < PortsLength; i++)
                {
                    PortNames[i] = new SerialPort(ports[i]);
                    baudList[i]  = PortNames[i].BaudRate;
                }

                // ポートオープンに成功したポートを設定保持する
                OpenPortParamClass    ScanComPort = new OpenPortParamClass();
                CardMachineErrorClass OpenRet     = ErrorCodeCheck(-1);
                for (int i = 0; i < PortsLength; i++)
                {
                    // ポート取得
                    ScanComPort.ComPort = short.Parse(portnolist[i]);
                    ScanComPort.Baud    = baudList[i];

                    // 取得ポートをオープンテスト
                    OpenRet = OpenPort(ScanComPort);

                    // 成否判定
                    if (OpenRet.ErrorCode == 0)
                    {
                        ComPort.ComPort = ScanComPort.ComPort;
                        ComPort.Baud    = ScanComPort.Baud;
                        break;
                    }
                }

                if (OpenRet.ErrorCode != 0)
                {
                    throw new Exception(OpenRet.ErrorMessage);
                }
            }
            catch
            {
                throw;
            }
        }
        /// <summary>
        /// 受け取った命令を実行する
        /// </summary>
        /// <param name="OrderName"></param>
        /// <param name="Param"></param>
        private void ExecutionCardMachine()
        {
            try
            {
                // 戻り値格納用
                CardMachineErrorClass ret = null;

                // 命令格納用
                OrderCardMachineClass Order = null;

                // 監視命令のステータスかどうか
                bool MonitoringFlag = false;

                // 命令が無ければ監視モード
                if (OrderQue.Count != 0)
                {
                    // 命令取得
                    Order = OrderQue.Dequeue();

                    // 監視命令OFF
                    MonitoringFlag = false;
                }
                else
                {
                    // 監視モードじゃなければ終了
                    if (!MonitoringMode)
                    {
                        return;
                    }

                    // ステータス監視
                    Order = new OrderCardMachineClass
                    {
                        OrderName = OrderCardMachineState.RmGetStatus,
                        Param     = new RmGetStatusParamClass()
                    };

                    // 監視命令ON
                    MonitoringFlag = true;
                }


                // 各種処理分岐
                switch (Order.OrderName)
                {
                case OrderCardMachineState.None:
                    break;

                case OrderCardMachineState.OpenPort:
                    ret = CardMachineCom.OpenPort((OpenPortParamClass)Order.Param);
                    break;

                case OrderCardMachineState.ClosePort:
                    ret = CardMachineCom.ClosePort();
                    break;

                case OrderCardMachineState.RmGetStatus:
                    ret = CardMachineCom.RmGetStatus((RmGetStatusParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmGetVersion:
                    ret = CardMachineCom.RmGetVersion((RmGetVersionParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendClock:
                    ret = CardMachineCom.RmSendClock((RmSendClockParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendRecCard:
                    ret = CardMachineCom.RmSendRecCard((RmSendRecCardParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmGetCardDataA:
                    ret = CardMachineCom.RmGetCardDataA((RmGetCardDataAParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendExchnge:
                    ret = CardMachineCom.RmSendExchnge((RmSendExchngeParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendSellA:
                    ret = CardMachineCom.RmSendSellA((RmSendSellAParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmGetCalcA:
                    ret = CardMachineCom.RmGetCalcA((RmGetCalcAParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendMessageData:
                    ret = CardMachineCom.RmSendMessageData((RmSendMessageDataParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendName:
                    ret = CardMachineCom.RmSendName((RmSendNameParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmGetICM:
                    ret = CardMachineCom.RmGetICM((RmGetICMParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmGetMode:
                    ret = CardMachineCom.RmGetMode((RmGetModeParamClass)Order.Param);
                    break;

                case OrderCardMachineState.RmSendProcRun:
                    ret = CardMachineCom.RmSendProcRun();
                    break;

                case OrderCardMachineState.RmSendCancel:
                    ret = CardMachineCom.RmSendCancel();
                    break;

                case OrderCardMachineState.RmSendCleaning:
                    ret = CardMachineCom.RmSendCleaning();
                    break;

                case OrderCardMachineState.RmSendTestMode:
                    ret = CardMachineCom.RmSendTestMode();
                    break;

                case OrderCardMachineState.RmSendICMClear:
                    ret = CardMachineCom.RmSendICMClear();
                    break;

                case OrderCardMachineState.RmSendModem:
                    ret = CardMachineCom.RmSendModem();
                    break;

                default:
                    break;
                }

                // 命令完了処理
                if (ret != null)
                {
                    // 応答処理
                    if (ret.ErrorCode == 0)
                    {
                        if (!MonitoringFlag)
                        {
                            ReturnData?.Invoke(Order.OrderName, Order.Param);
                        }
                        else
                        {
                            // 監視モード時の特殊応答
                            MonitoringEventReturn(Order, ret);
                        }
                    }
                    else
                    {
                        Error = ret;
                        ErrorEvent?.Invoke(Error);
                    }
                }
            }
            catch
            {
                throw;
            }
        }