//// シリアル通信 データ をカレント情報として設定 //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( ); // 通信完了 }
public CExcept_(enErrCode_ e, string strAddBuf) { envar = e; strAdded = strAddBuf; }
private string strAdded = null; // エラー付加文字 /// <summary> /// コンストラクタ /// </summary> /// <param name="e"></param> public CExcept_(enErrCode_ e) { envar = e; }
//// シリアル通信 データ をカレント情報として設定 //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)); //送信 }
/// <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)); //送信 }
//// シリアル接続 //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); }