//// シリアル通信 データ をカレント情報として設定 //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( ); // 通信完了 }
// vaccumをパーサー public void RecvParser_vacDat(byte [] bytVacParserRecv, ref double refvac) { byte [] bytArraybuf = new byte [4]; Array.Copy(bytVacParserRecv, Array.FindIndex(bytVacParserRecv, num => num == 0x56) + 1, //v bytArraybuf, 0, bytArraybuf.Length); refvac = ( double )(int.Parse(CCommUtility.GetInstance().AsciiToString_(bytArraybuf))); refvac = -1.0 * refvac * 0.01; // 負圧扱いなので、マイナス値にする // refvac = double.Parse ( bytArraybuf.ToString ( ) ); }
/// <summary> /// すべての文字列送信 /// </summary> /// <param name="list_str_src"></param> /// <param name="refSeriPrt"></param> /// <param name="iIntvalTm"></param> 送信間隔 public void Async_Protocol_Send_AllDat(List <string> list_str_src, ref SerialPort refSeriPrt, int iIntvalTm) { // enErrCode_ enret = enErrCode_.en_success; // TextBox送信文字列から送信用文字列(ASCII)を生成したもの List <string> list_str_ascii_senddat = new List <string> ( ); // 送信文字をListに埋めていく for (int i = 0; i < list_str_src.Count(); i++) { // 中断 if (bCommEndFlg) { throw new CExcept_(enErrCode_.en_err_comm_interrupt); } string strsenddat = list_str_src[i]; // ASCIIタイプ // if (enSendType == CommTestTool.Form1.enSendType.en_SendType_Ascii) { // byte bdat; switch (strsenddat) { case "ENQ": { string strbuf = null; strbuf = System.Text.Encoding.ASCII.GetString(ENQ); list_str_ascii_senddat.Add(strbuf); break; } case "ACK": { string strbuf = null; strbuf = System.Text.Encoding.ASCII.GetString(ACK); list_str_ascii_senddat.Add(strbuf); break; } case "EOT": { string strbuf = null; strbuf = System.Text.Encoding.ASCII.GetString(EOT); list_str_ascii_senddat.Add(strbuf); break; } case "CAN": { string strbuf = null; strbuf = System.Text.Encoding.ASCII.GetString(CAN); list_str_ascii_senddat.Add(strbuf); break; } case "CR": { string strbuf = null; strbuf = System.Text.Encoding.ASCII.GetString(CR); list_str_ascii_senddat.Add(strbuf); break; } case "LF": { string strbuf = null; strbuf = System.Text.Encoding.ASCII.GetString(LF); list_str_ascii_senddat.Add(strbuf); break; } // 自作送信文字列 default: { string strbuf = null; byte[] bAsciiDat = null; // 入力された送信データ bAsciiDat = CCommUtility.GetInstance().StringToAscii_(strsenddat); strbuf = System.Text.Encoding.ASCII.GetString(bAsciiDat); list_str_ascii_senddat.Add(strbuf); break; } } } // } bAsyncRecvContinueFlg = false; foreach (string strsenddat in list_str_ascii_senddat) { // 中断 if (bCommEndFlg) { throw new CExcept_(enErrCode_.en_err_comm_interrupt); } // 送信バッファクリア refSeriPrt.DiscardOutBuffer( ); // 受信バッファと同期させる DateTime st_time = DateTime.Now; while (true) { if (!bAsyncRecvContinueFlg) { break; } // 中断 if (bCommEndFlg) { throw new CExcept_(enErrCode_.en_err_comm_interrupt); } // add 151111 // タイムアウト DateTime now_tm = DateTime.Now; TimeSpan span = now_tm - st_time; if (span.Seconds > 5) { break; } // add end //待機 System.Threading.Thread.Sleep(consTM_5MS); } // 送信 refSeriPrt.Write(strsenddat); //送信 bAsyncRecvContinueFlg = true; // 受信待ちフラグON // 送信文字をFormに投げる cnt_mainform.Invoke(eveCommGenePurPosApi, new Object [] { "→ " + SprSgm.CUtility.ChgUnicodeToAscii_ForRecvDat(strsenddat) + "\r\n" }); //待機 System.Threading.Thread.Sleep(iIntvalTm); } }
//// シリアル通信 データ をカレント情報として設定 //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)); //送信 }