private void OpenBtn_Click(object sender, EventArgs e) { try { if (serial.IsOpen) { serial.Close(); } else { serial.Open(); } } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
void InitializeIEC() { GXManufacturer manufacturer = this.Parent.Manufacturers.FindByIdentification(Parent.Manufacturer); if (manufacturer == null) { throw new Exception("Unknown manufacturer " + Parent.Manufacturer); } GXSerial serial = Media as GXSerial; byte Terminator = (byte)0x0A; if (serial != null && Parent.StartProtocol == StartProtocolType.IEC) { serial.BaudRate = 300; serial.DataBits = 7; serial.Parity = Parity.Even; serial.StopBits = StopBits.One; } Media.Open(); //Query device information. if (Media != null && Parent.StartProtocol == StartProtocolType.IEC) { string data = "/?!\r\n"; if (this.Parent.HDLCAddressing == HDLCAddressType.SerialNumber) { data = "/?" + this.Parent.PhysicalAddress + "!\r\n"; } GXLogWriter.WriteLog("HDLC sending:" + data); ReceiveParameters <string> p = new ReceiveParameters <string>() { AllData = false, Eop = Terminator, WaitTime = Parent.WaitTime * 1000 }; lock (Media.Synchronous) { Media.Send(data, null); if (!Media.Receive(p)) { //Try to move away from mode E. try { this.ReadDLMSPacket(this.DisconnectRequest(), 1); } catch (Exception ex) { } data = (char)0x01 + "B0" + (char)0x03 + "\r\n"; Media.Send(data, null); p.Count = 1; Media.Receive(p); data = "Failed to receive reply from the device in given time."; GXLogWriter.WriteLog(data); throw new Exception(data); } //If echo is used. if (p.Reply == data) { p.Reply = null; if (!Media.Receive(p)) { //Try to move away from mode E. this.ReadDLMSPacket(this.DisconnectRequest(), 1); if (serial != null) { data = (char)0x01 + "B0" + (char)0x03 + "\r\n"; Media.Send(data, null); p.Count = 1; if (!Media.Receive(p)) { } serial.DtrEnable = serial.RtsEnable = false; serial.BaudRate = 9600; serial.DtrEnable = serial.RtsEnable = true; data = (char)0x01 + "B0" + (char)0x03 + "\r\n"; Media.Send(data, null); p.Count = 1; Media.Receive(p); } data = "Failed to receive reply from the device in given time."; GXLogWriter.WriteLog(data); throw new Exception(data); } } } GXLogWriter.WriteLog("HDLC received: " + p.Reply); if (p.Reply[0] != '/') { p.WaitTime = 100; Media.Receive(p); throw new Exception("Invalid responce."); } string manufactureID = p.Reply.Substring(1, 3); UpdateManufactureSettings(manufactureID); char baudrate = p.Reply[4]; int BaudRate = 0; switch (baudrate) { case '0': BaudRate = 300; break; case '1': BaudRate = 600; break; case '2': BaudRate = 1200; break; case '3': BaudRate = 2400; break; case '4': BaudRate = 4800; break; case '5': BaudRate = 9600; break; case '6': BaudRate = 19200; break; default: throw new Exception("Unknown baud rate."); } GXLogWriter.WriteLog("BaudRate is : " + BaudRate.ToString()); //Send ACK //Send Protocol control character byte controlCharacter = (byte)'2';// "2" HDLC protocol procedure (Mode E) //Send Baud rate character //Mode control character byte ModeControlCharacter = (byte)'2';//"2" //(HDLC protocol procedure) (Binary mode) //Set mode E. byte[] arr = new byte[] { 0x06, controlCharacter, (byte)baudrate, ModeControlCharacter, 13, 10 }; GXLogWriter.WriteLog("Moving to mode E.", arr); lock (Media.Synchronous) { Media.Send(arr, null); System.Threading.Thread.Sleep(500); serial.BaudRate = BaudRate; p.Reply = null; p.WaitTime = 100; //Note! All meters do not echo this. Media.Receive(p); if (p.Reply != null) { GXLogWriter.WriteLog("Received: " + p.Reply); } serial.Close(); serial.DataBits = 8; serial.Parity = Parity.None; serial.StopBits = StopBits.One; serial.Open(); System.Threading.Thread.Sleep(500); } } }
private static void InitializeIEC(TraceLevel trace, Media media) { GXSerial serial = (GXSerial)media.Target; serial.BaudRate = 300; serial.DataBits = 7; serial.Parity = Parity.Even; serial.StopBits = StopBits.One; byte Terminator = (byte)0x0A; //Some meters need a little break. Thread.Sleep(1000); //Query device information. string data = "/?!\r\n"; WriteLog(trace, "IEC Sending:" + data); if (media.WaitTime == 0) { media.WaitTime = 5; } ReceiveParameters <string> p = new ReceiveParameters <string>() { AllData = false, Eop = Terminator, WaitTime = media.WaitTime * 1000 }; lock (media.Target.Synchronous) { media.Target.Send(data, null); if (!media.Target.Receive(p)) { DiscIEC(media); string str = "Failed to receive reply from the device in given time."; WriteLog(trace, str); media.Target.Send(data, null); if (!media.Target.Receive(p)) { throw new Exception(str); } } //If echo is used. if (p.Reply == data) { p.Reply = null; if (!media.Target.Receive(p)) { data = "Failed to receive reply from the device in given time."; WriteLog(trace, data); throw new Exception(data); } } } WriteLog(trace, "IEC received: " + p.Reply); if (p.Reply[0] != '/') { p.WaitTime = 100; media.Target.Receive(p); throw new Exception("Invalid responce."); } string manufactureID = p.Reply.Substring(1, 3); char baudrate = p.Reply[4]; int BaudRate; switch (baudrate) { case '0': BaudRate = 300; break; case '1': BaudRate = 600; break; case '2': BaudRate = 1200; break; case '3': BaudRate = 2400; break; case '4': BaudRate = 4800; break; case '5': BaudRate = 9600; break; case '6': BaudRate = 19200; break; default: throw new Exception("Unknown baud rate."); } if (media.MaximumBaudRate != 0) { BaudRate = media.MaximumBaudRate; baudrate = GetIecBaudRate(BaudRate); WriteLog(trace, "Maximum BaudRate is set to : " + BaudRate.ToString()); } WriteLog(trace, "BaudRate is : " + BaudRate.ToString()); //Send ACK //Send Protocol control character // "2" HDLC protocol procedure (Mode E) byte controlCharacter = (byte)'2'; //Send Baud rate character //Mode control character byte ModeControlCharacter = (byte)'2'; //"2" //(HDLC protocol procedure) (Binary mode) //Set mode E. byte[] arr = new byte[] { 0x06, controlCharacter, (byte)baudrate, ModeControlCharacter, 13, 10 }; WriteLog(trace, "Moving to mode E. " + GXCommon.ToHex(arr)); lock (media.Target.Synchronous) { p.Reply = null; media.Target.Send(arr, null); p.WaitTime = 2000; //Note! All meters do not echo this. media.Target.Receive(p); if (p.Reply != null) { WriteLog(trace, "Received: " + p.Reply); } media.Target.Close(); serial.BaudRate = BaudRate; serial.DataBits = 8; serial.Parity = Parity.None; serial.StopBits = StopBits.One; serial.Open(); //Some meters need this sleep. Do not remove. Thread.Sleep(1000); } }
void InitSerial() { GXSerial serial = Media as GXSerial; byte Terminator = (byte)0x0A; if (serial != null && InitializeIEC) { serial.BaudRate = 300; serial.DataBits = 7; serial.Parity = Parity.Even; serial.StopBits = StopBits.One; } Media.Open(); //Query device information. if (Media != null && InitializeIEC) { string data = "/?!\r\n"; if (Trace) { Console.WriteLine("IEC sending:" + data); } ReceiveParameters <string> p = new ReceiveParameters <string>() { Eop = Terminator, WaitTime = WaitTime }; lock (Media.Synchronous) { WriteTrace("<- " + DateTime.Now.ToLongTimeString() + "\t" + GXCommon.ToHex(ASCIIEncoding.ASCII.GetBytes(data), true)); Media.Send(data, null); if (!Media.Receive(p)) { //Try to move away from mode E. try { GXReplyData reply = new GXReplyData(); ReadDLMSPacket(Client.DisconnectRequest(), reply); } catch (Exception) { } data = (char)0x01 + "B0" + (char)0x03; Media.Send(data, null); p.Count = 1; if (!Media.Receive(p)) { } data = "Failed to receive reply from the device in given time."; Console.WriteLine(data); throw new Exception(data); } WriteTrace("-> " + DateTime.Now.ToLongTimeString() + "\t" + GXCommon.ToHex(ASCIIEncoding.ASCII.GetBytes(p.Reply), true)); //If echo is used. if (p.Reply == data) { p.Reply = null; if (!Media.Receive(p)) { //Try to move away from mode E. GXReplyData reply = new GXReplyData(); ReadDLMSPacket(Client.DisconnectRequest(), reply); if (serial != null) { data = (char)0x01 + "B0" + (char)0x03; Media.Send(data, null); p.Count = 1; Media.Receive(p); serial.BaudRate = 9600; data = (char)0x01 + "B0" + (char)0x03 + "\r\n"; Media.Send(data, null); p.Count = 1; Media.Receive(p); } data = "Failed to receive reply from the device in given time."; Console.WriteLine(data); throw new Exception(data); } WriteTrace("-> " + DateTime.Now.ToLongTimeString() + "\t" + GXCommon.ToHex(ASCIIEncoding.ASCII.GetBytes(p.Reply), true)); } } Console.WriteLine("IEC received: " + p.Reply); if (p.Reply[0] != '/') { p.WaitTime = 100; Media.Receive(p); throw new Exception("Invalid responce."); } string manufactureID = p.Reply.Substring(1, 3); UpdateManufactureSettings(manufactureID); char baudrate = p.Reply[4]; int BaudRate = 0; switch (baudrate) { case '0': BaudRate = 300; break; case '1': BaudRate = 600; break; case '2': BaudRate = 1200; break; case '3': BaudRate = 2400; break; case '4': BaudRate = 4800; break; case '5': BaudRate = 9600; break; case '6': BaudRate = 19200; break; default: throw new Exception("Unknown baud rate."); } Console.WriteLine("BaudRate is : " + BaudRate.ToString()); //Send ACK //Send Protocol control character byte controlCharacter = (byte)'2';// "2" HDLC protocol procedure (Mode E) //Send Baudrate character //Mode control character byte ModeControlCharacter = (byte)'2';//"2" //(HDLC protocol procedure) (Binary mode) //Set mode E. byte[] arr = new byte[] { 0x06, controlCharacter, (byte)baudrate, ModeControlCharacter, 13, 10 }; Console.WriteLine("Moving to mode E.", arr); lock (Media.Synchronous) { WriteTrace("<- " + DateTime.Now.ToLongTimeString() + "\t" + GXCommon.ToHex(arr, true)); Media.Send(arr, null); p.Reply = null; if (!Media.Receive(p)) { //Try to move away from mode E. GXReplyData reply = new GXReplyData(); ReadDLMSPacket(Client.DisconnectRequest(), reply); data = "Failed to receive reply from the device in given time."; Console.WriteLine(data); throw new Exception(data); } WriteTrace("-> " + DateTime.Now.ToLongTimeString() + "\t" + GXCommon.ToHex(ASCIIEncoding.ASCII.GetBytes(p.Reply), true)); Console.WriteLine("Received: " + p.Reply); if (serial != null) { System.Threading.Thread.Sleep(400); serial.Close(); serial.BaudRate = BaudRate; serial.DataBits = 8; serial.Parity = Parity.None; serial.StopBits = StopBits.One; System.Threading.Thread.Sleep(400); serial.Open(); serial.ResetSynchronousBuffer(); } } } }