예제 #1
0
        //// シリアル通信 データ をカレント情報として設定
        //public void Set_SerialComm ( serial_comm.CSerialComm m_seridat ) {
        //    m_seriCur = m_seridat;
        //}

        // TypeA 通信プロトコル
        /// <summary>
        /// 通信プロトコルA throw CErrCode_型
        /// </summary>
        /// <param name="rtdbdat"></param>
        /// <param name="refSeriPrt"></param>
        public void Sync_ProtocolA(CCmdRtDBType_var rtdbdat, ref SerialPort refSeriPrt)
        {
            enErrCode_  enret       = enErrCode_.en_success;
            List <byte> receivedBuf = new List <byte> ( ); // 受信バッファ

            string strSendDat = null;                      //rs232cで送信する文字列

            // コマンドパケット生成
            if ((enret = CCommUtility.GetInstance().Create_Send_Dat(rtdbdat.strCmdName, ref strSendDat, false, false, false, false, false, false, false, CommTestTool.Form1.enSendType.en_SendType_Hex)) != enErrCode_.en_success)            // bool型フラグは全てfalse / 本ソフトウェアでは、Form上でboolフラグ入りの送信文字列が作成されるため、boolフラグは全てOFFにする
            {
                throw new CExcept_(enret);
            }

            //! 送信するテキストがない場合、データ送信は行わない.
            if (string.IsNullOrEmpty(strSendDat) == true)
            {
                throw new CExcept_(enErrCode_.en_err_none_send_str);
            }

            refSeriPrt.Write(strSendDat);    //送信

            //待機
            System.Threading.Thread.Sleep(10);

            // 応答パケット(同期通信)
            while (refSeriPrt.BytesToRead > 0)
            {
                // 1バイト受信してバッファに格納
                receivedBuf.Add(( byte )refSeriPrt.ReadByte( ));
            }
            // 配列に変換
            byte [] recevDat = receivedBuf.ToArray( );

            // 通信完了
        }
예제 #2
0
 public CExcept_(enErrCode_ e, string strAddBuf)
 {
     envar    = e;
     strAdded = strAddBuf;
 }
예제 #3
0
        private string strAdded = null;             // エラー付加文字


        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="e"></param>
        public CExcept_(enErrCode_ e)
        {
            envar = e;
        }
예제 #4
0
        //// シリアル通信 データ をカレント情報として設定
        //public void Set_SerialComm ( serial_comm.CSerialComm m_seridat ) {
        //    m_seriCur = m_seridat;
        //}

        //// 別スレッドでタイマー待ち
        //private void timer_action ( ) {
        //    Thread.Sleep ( 3000 );
        //}


        /// <summary>
        /// 通信プロトコル throw CErrCode型
        /// </summary>
        public void Sync_Protocol_Send_DL(string str_src, ref SerialPort refSeriPrt)
        {
            enErrCode_  enret       = enErrCode_.en_success;
            List <byte> receivedBuf = new List <byte> ( ); //受信バッファ
            string      strSendDat  = null;                //rs232cで送信する文字列

            //    ThreadStart thd_deleg = new ThreadStart ( timer_action);
            //      Thread tm_thd = new Thread ( thd_deleg );
            bCommEndFlg = false;    // 通信中断フラグ初期化

            // 受信/送信バッファクリア
            refSeriPrt.DiscardInBuffer( );
            refSeriPrt.DiscardOutBuffer( );

            // ENQ発行
            refSeriPrt.Write(System.Text.Encoding.ASCII.GetString(ENQ));       //送信

            //待機
            System.Threading.Thread.Sleep(consTM_5MS);

            // ACKの受信
            // 応答パケット(同期通信)
            while (true)
            {
                if (refSeriPrt.BytesToRead > 0)
                {
                    // 1バイト受信してバッファに格納
                    //benddat = ( byte ) refSeriPrt.ReadByte ( );
                    receivedBuf.Add(( byte )refSeriPrt.ReadByte( ));

                    ////待機
                    //System.Threading.Thread.Sleep ( consTM_5MS );

                    break;
                }
                else if (bCommEndFlg)           // 通信中断確認
                {
                    throw new CExcept_(enErrCode_.en_err_comm_interrupt);
                }
                //待機
                System.Threading.Thread.Sleep(consTM_5MS);
            }

            //// 応答パケット(同期通信)
            //    while ( refSeriPrt.BytesToRead > 0 ) {
            //        byte brevbuf = ( byte ) refSeriPrt.ReadByte ( );
            //        receivedBuf.Add ( brevbuf );
            //        if ( brevbuf == ACK[0] )       // 終了文字
            //            break;
            //    }

            // ACK受信確認
            if (receivedBuf.Count() < 0 ||
                receivedBuf [0] != 0x06)
            {
                Sync_ErrSeq2(ref refSeriPrt);           // Error 2
                throw new CExcept_(enErrCode_.en_err_recv_ack);
            }


            // 通信コマンド生成
            if ((enret = CCommUtility.GetInstance().Create_Send_Dat(str_src, ref strSendDat, false, false, false, false, false, false, false, CommTestTool.Form1.enSendType.en_SendType_Hex)) != enErrCode_.en_success)
            {
                throw new CExcept_(enret);
            }

            receivedBuf.Clear( );

            // 送信
            refSeriPrt.Write(strSendDat);    //送信

            //待機
            System.Threading.Thread.Sleep(consTM_5MS);

            // 応答パケット(同期通信)
            int irecvsz = 0;     // BytesToReadのサイズ

            while (true)
            {
                if ((irecvsz = refSeriPrt.BytesToRead) > 0)
                {
                    byte [] bbuf = new byte [irecvsz];

                    refSeriPrt.Read(bbuf, 0, bbuf.Length);

                    foreach (byte v in bbuf)
                    {
                        receivedBuf.Add(v);
                    }
                    //           receivedBuf.Add ( ( byte ) refSeriPrt.ReadByte ( ) );         // バイトで取得しない

                    if (receivedBuf [receivedBuf.Count( ) - 1] == 0x03)
                    {
                        break;
                    }
                }
                else if (bCommEndFlg)           // 通信中断確認
                {
                    throw new CExcept_(enErrCode_.en_err_comm_interrupt);
                }

                //待機
                System.Threading.Thread.Sleep(consTM_5MS);
            }


            // delete 150708
            //// A0の受信
            //// 応答パケット(同期通信)
            //while ( refSeriPrt.BytesToRead > 0 ) {
            //    // 1バイト受信してバッファに格納
            //    //benddat = ( byte ) refSeriPrt.ReadByte ( );
            //    receivedBuf.Add ( ( byte ) refSeriPrt.ReadByte ( ) );

            //    // タイムアウトは上位でcatchしてくれ

            //    //待機
            //    System.Threading.Thread.Sleep ( consTM_5MS );
            //}


            // A0受信確認
            if (receivedBuf.Count( ) < 4 ||
                receivedBuf [4] != 0x30)
            {
                Sync_ErrSeq2(ref refSeriPrt);           // Error 2
                throw new CExcept_(enErrCode_.en_err_recv_a0);
            }

            // EOT送信
            refSeriPrt.Write(System.Text.Encoding.ASCII.GetString(EOT));       //送信
        }
예제 #5
0
        /// <summary>
        /// 通信プロトコル throw CErrCode型
        /// </summary>
        public void Sync_Protocol_Send_UP(string str_src, ref byte[] refbyteRecvDat, int iszRecvbuf, ref SerialPort refSeriPrt)
        {
            enErrCode_  enret       = enErrCode_.en_success;
            List <byte> receivedBuf = new List <byte> ( ); //受信バッファ
            string      strSendDat  = null;                //rs232cで送信する文字列

            bCommEndFlg = false;                           // 通信中断フラグ初期化

            //   string strRecvDat = null;   // rs232cで受信した文字列
            //bool bendflg = false;
            //byte benddat = 0x00;


            // 受信/送信バッファクリア
            refSeriPrt.DiscardInBuffer( );
            refSeriPrt.DiscardOutBuffer( );

            // ENQ発行
            refSeriPrt.Write(System.Text.Encoding.ASCII.GetString(ENQ));       //送信

            //待機
            System.Threading.Thread.Sleep(consTM_5MS);


            // ACKの受信
            // 応答パケット(同期通信)
            while (true)
            {
                if (refSeriPrt.BytesToRead > 0)
                {
                    // 1バイト受信してバッファに格納
                    //benddat = ( byte ) refSeriPrt.ReadByte ( );
                    receivedBuf.Add(( byte )refSeriPrt.ReadByte( ));

                    ////待機
                    //System.Threading.Thread.Sleep ( consTM_5MS );

                    break;
                }
                else if (bCommEndFlg)           // 通信中断確認
                {
                    throw new CExcept_(enErrCode_.en_err_comm_interrupt);
                }

                //待機
                System.Threading.Thread.Sleep(consTM_5MS);
            }

            // ACK受信確認
            if (receivedBuf.Count() < 0 ||
                receivedBuf [0] != 0x06)
            {
                throw new CExcept_(enErrCode_.en_err_recv_ack);
            }

            // 通信コマンド生成
            if ((enret = CCommUtility.GetInstance().Create_Send_Dat(str_src, ref strSendDat, false, false, false, false, false, false, false, CommTestTool.Form1.enSendType.en_SendType_Hex)) != enErrCode_.en_success)
            {
                throw new CExcept_(enret);
            }

            receivedBuf.Clear( );
            bRecvBuf.Initialize( );

            // 送信
            refSeriPrt.Write(strSendDat);    //送信


            //待機
            System.Threading.Thread.Sleep(consTM_5MS);
            //bendflg = false;

            // A0の受信
            // 応答パケット(同期通信)
            int irecvsz = 0;     // BytesToReadのサイズ

            while (true)
            {
                if ((irecvsz = refSeriPrt.BytesToRead) > 0)
                {
                    byte [] bbuf = new byte [irecvsz];

                    refSeriPrt.Read(bbuf, 0, bbuf.Length);

                    foreach (byte v in bbuf)
                    {
                        receivedBuf.Add(v);
                    }
                    //           receivedBuf.Add ( ( byte ) refSeriPrt.ReadByte ( ) );         // バイトで取得しない

                    if (receivedBuf [receivedBuf.Count( ) - 1] == 0x03)
                    {
                        break;
                    }
                }

                if (bCommEndFlg)           // 通信中断確認
                {
                    throw new CExcept_(enErrCode_.en_err_comm_interrupt);
                }

                //待機
                System.Threading.Thread.Sleep(consTM_5MS);
            }

            // delete 150708
            // // 応答パケット(同期通信)
            // while ( refSeriPrt.BytesToRead > 0){
            ////     && !bendflg ) {
            //     // 1バイト受信してバッファに格納
            //     //benddat = ( byte ) refSeriPrt.ReadByte ( );
            //     receivedBuf.Add ( ( byte ) refSeriPrt.ReadByte ( ) );

            //     // タイムアウトは上位でcatchしてくれ
            //     //if ( benddat == 0x03 )
            //     //    bendflg = true;

            //     //待機
            //     System.Threading.Thread.Sleep ( consTM_5MS );
            // }


            // A0受信確認
            if (receivedBuf.Count() < 4 ||
                receivedBuf [4] != 0x30)
            {
                throw new CExcept_(enErrCode_.en_err_recv_a0);
            }


            // ACK発行
            refSeriPrt.Write(System.Text.Encoding.ASCII.GetString(ACK));       //送信

            receivedBuf.Clear( );

            //待機
            System.Threading.Thread.Sleep(consTM_5MS);


            // 応答パケット(同期通信)
            //   int irecvsz = 0;     // BytesToReadのサイズ
            while (true)
            {
                if ((irecvsz = refSeriPrt.BytesToRead) > 0)
                {
                    byte [] bbuf = new byte [irecvsz];

                    refSeriPrt.Read(bbuf, 0, bbuf.Length);

                    foreach (byte v in bbuf)
                    {
                        receivedBuf.Add(v);
                    }
                    //           receivedBuf.Add ( ( byte ) refSeriPrt.ReadByte ( ) );         // バイトで取得しない

                    if (receivedBuf [receivedBuf.Count( ) - 1] == 0x03)
                    {
                        break;
                    }
                }

                if (bCommEndFlg)           // 通信中断確認
                {
                    throw new CExcept_(enErrCode_.en_err_comm_interrupt);
                }

                //待機
                System.Threading.Thread.Sleep(consTM_5MS);
            }

            // delete 150708
            //       // 応答パケット(同期通信)
            //       int irecvsz =0;     // BytesToReadのサイズ
            //       while ( (irecvsz =refSeriPrt.BytesToRead) > 0 ) {
            //            byte [] bbuf = new byte[irecvsz];

            //            refSeriPrt.Read ( bbuf, 0, bbuf.Length );

            //           foreach ( byte v in bbuf ) {
            //               receivedBuf.Add ( v );
            //           }
            ////           receivedBuf.Add ( ( byte ) refSeriPrt.ReadByte ( ) );         // バイトで取得しない

            //           //待機
            //           System.Threading.Thread.Sleep ( consTM_5MS );
            //       }


            // 受信文字列が、受信文字取得用バッファのサイズに納まるものか確認
            if (receivedBuf.Count( ) > iszRecvbuf)
            {
                throw new CExcept_(enErrCode_.en_err_recv_buff_ovrflow);
            }

            receivedBuf.ToArray().CopyTo(refbyteRecvDat, 0);


            // EOT送信
            refSeriPrt.Write(System.Text.Encoding.ASCII.GetString(EOT));       //送信
        }
예제 #6
0
        //// シリアル接続
        //public void Connect_rs232c ( SerialPort m_prt, ref CSerialComm refcomm ) {

        //    try {
        //        if ( m_prt.IsOpen == true ) {
        //            m_prt.Close ( );
        //        }

        //        // 変数をセットする
        //        m_prt.BaudRate = refcomm.m_baurate.Baurate; // ボーレート
        //        m_prt.DataBits = refcomm.DatBit;    // データビット
        //        m_prt.Parity = refcomm.Parity;  // パリティ
        //        m_prt.StopBits = refcomm.StpBit;    // ストップビット
        //        m_prt.Handshake = refcomm.m_handshake.Handshake; // ハンドシェイク
        //        m_prt.Encoding = refcomm.Encoding; // エンコード
        //    }
        //    catch ( Exception ex ) {

        //    }
        //}

        // 送信文字列生成
        public enErrCode_ Create_Send_Dat(string strSendData, ref string refstrSendDat, bool bstx, bool betx, bool bchksum, bool bstrlen, bool bcr, bool blf, bool bcrc, CommTestTool.Form1.enSendType ensendtype)
        {
            enErrCode_ enret = enErrCode_.en_success;

            //  string hexDat;
            var listSendDat = new List <byte>();           // 送信データリスト(byte型)


            // ASCII文字系の通信
            if (ensendtype == CommTestTool.Form1.enSendType.en_SendType_Ascii)
            {
                // 文字列長(2ケタ)有無
                if (bstrlen)
                {
                    string strlenbuf  = strSendData.Length.ToString("X2");
                    byte[] bStrLenBuf = StringToAscii_(strlenbuf);


                    for (int i = 0; i < bStrLenBuf.Length; i++)
                    {
                        listSendDat.Add(bStrLenBuf[i]);
                    }
                }

                byte[] bAsciiDat = null;          // 入力された送信データ
                bAsciiDat = StringToAscii_(strSendData);

                int isz = bAsciiDat.GetLength(0);

                for (int i = 0; i < isz; i++)
                {
                    listSendDat.Add(bAsciiDat[i]);
                }


                // チェックサムの有無
                if (bchksum)
                {
                    // チェックサムを計算
                    byte chkdam = CalcChkSum(listSendDat.ToArray());
                    //         byte chkdam = CCommUtility.CalcChkSum ( bAsciiDat );

                    // チェックサム
                    byte[] bytechksumary;
                    bytechksumary = new byte[2];

                    bytechksumary[0] = (byte)((int)(chkdam & 0xF0) >> 4);
                    bytechksumary[1] = (byte)((int)chkdam & 0x0F);


                    isz = bytechksumary.Length;
                    for (int i = 0; i < isz; i++)
                    {
                        listSendDat.Add(byteToAscii_(bytechksumary[i]));
                    }
                }


                //stxの有無
                if (bstx)
                {
                    //        if ( m_sericomm.m_addstrcommdat.stx ) {
                    byte nstx = 0x02;
                    listSendDat.Insert(0, nstx);
                }

                // etxの有無
                if (betx)
                {
                    //            if ( m_sericomm.m_addstrcommdat.etx ) {
                    byte netx = 0x03;
                    listSendDat.Add(netx);
                }

                // CR
                if (bcr)
                {
                    byte ncr = 0x0D;
                    listSendDat.Add(ncr);
                }

                // LF
                if (blf)
                {
                    byte nlf = 0x0A;
                    listSendDat.Add(nlf);
                }

                // 送信データ配列(byte型)
                byte[] bSendDat = listSendDat.ToArray();

                refstrSendDat = System.Text.Encoding.ASCII.GetString(bSendDat);
            }


            // 16進 直送
            else
            {
                // CRC
                if (bcrc)
                {
                    refstrSendDat = strSendData + BitConverter.ToString(calc_crc(StringToByte_(strSendData))).Replace("-", "");
                    //    ushbuf.ToString();
                }
            }

            return(enret);
        }