using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.IO.Ports; using System.Windows.Forms; using System.IO; //CodeProjectSerialComms program //23/04/2013 16:29 namespace CPFConsole { public partial class Form1 : Form { SerialPort ComPort = new SerialPort(); internal delegate void SerialDataReceivedEventHandlerDelegate(object sender, SerialDataReceivedEventArgs e); internal delegate void SerialPinChangedEventHandlerDelegate(object sender, SerialPinChangedEventArgs e); private SerialPinChangedEventHandler SerialPinChangedEventHandler1; delegate void SetTextCallback(string text); string InputData = String.Empty; private StreamWriter logFile; private DynamicModel CPFModel = new DynamicModel(); public Form1() { InitializeComponent(); SerialPinChangedEventHandler1 = new SerialPinChangedEventHandler(PinChanged); ComPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1); getSerialPorts(); portState(); CPFModel.runModel(); logFile = new StreamWriter("C:\\Users\\magene\\Documents\\CPF\\CPFData\\ConsoleData\\" + DateTime.Now.ToString("yyyyMMMddTHH-mm-ss")); } private void btnGetSerialPorts_Click(object sender, EventArgs e) { getSerialPorts(); } private void getSerialPorts() { string[] ArrayComPortsNames = null; int index = -1; string ComPortName = null; //Com Ports ArrayComPortsNames = SerialPort.GetPortNames(); do { index += 1; cboPorts.Items.Add(ArrayComPortsNames[index]); } while (!((ArrayComPortsNames[index] == ComPortName) || (index == ArrayComPortsNames.GetUpperBound(0)))); Array.Sort(ArrayComPortsNames); if (index == ArrayComPortsNames.GetUpperBound(0)) { ComPortName = ArrayComPortsNames[0]; } //get first item print in text cboPorts.Text = "COM1"; //Baud Rate cboBaudRate.Items.Add(300); cboBaudRate.Items.Add(600); cboBaudRate.Items.Add(1200); cboBaudRate.Items.Add(2400); cboBaudRate.Items.Add(9600); cboBaudRate.Items.Add(14400); cboBaudRate.Items.Add(19200); cboBaudRate.Items.Add(38400); cboBaudRate.Items.Add(57600); cboBaudRate.Items.Add(115200); cboBaudRate.Items.ToString(); //get first item print in text cboBaudRate.Text = cboBaudRate.Items[9].ToString(); //Data Bits cboDataBits.Items.Add(7); cboDataBits.Items.Add(8); //get the first item print it in the text cboDataBits.Text = cboDataBits.Items[1].ToString(); //Stop Bits cboStopBits.Items.Add("One"); cboStopBits.Items.Add("OnePointFive"); cboStopBits.Items.Add("Two"); //get the first item print in the text cboStopBits.Text = cboStopBits.Items[0].ToString(); //Parity cboParity.Items.Add("None"); cboParity.Items.Add("Even"); cboParity.Items.Add("Mark"); cboParity.Items.Add("Odd"); cboParity.Items.Add("Space"); //get the first item print in the text cboParity.Text = cboParity.Items[0].ToString(); //Handshake cboHandShaking.Items.Add("None"); cboHandShaking.Items.Add("XOnXOff"); cboHandShaking.Items.Add("RequestToSend"); cboHandShaking.Items.Add("RequestToSendXOnXOff"); //get the first item print it in the text cboHandShaking.Text = cboHandShaking.Items[0].ToString(); } private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e) { InputData = ComPort.ReadExisting(); if (InputData != String.Empty) { this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData }); } } private static StringBuilder incomingMessage = new StringBuilder(512); private static string logMessage = ""; private static int qSize = 1020; private void SetText(string text) { //Clean up the text and only post messages to the CPFMessages rtb that start with a $ and end with a LF incomingMessage.Append(text); Console.WriteLine(incomingMessage.ToString()); //Make sure the message starts with a $ int stxIndex = incomingMessage.ToString().IndexOf('$'); if (stxIndex == 0) { } else { if (stxIndex > 0) incomingMessage.Remove(0, stxIndex); } //If the message is terminated with a LF: 1) post it to the CPFMessage textbox, // 2) remove it from incomingMessage, // 3) parse and display fields // 4) write it to the log file int etxIndex = incomingMessage.ToString().IndexOf('\n'); if (etxIndex >= 0) { rtbCPFMessages.AppendText(incomingMessage.ToString(0, etxIndex)); Console.Write(incomingMessage.ToString(0, etxIndex)); parseCPFMessage(incomingMessage.ToString(0, etxIndex)); try { logMessage = ""; logMessage = logMessage + incomingMessage.ToString(); logMessage = logMessage.Substring(0, logMessage.IndexOf('\r')); logMessage = logMessage.Trim(); if (logMessage.Length <= 2) {} else logFile.WriteLine(logMessage); } catch { Console.Write("Error building log file message"); logFile.WriteLine("Error building log file message"); } incomingMessage.Remove(0, etxIndex); } } private void parseCPFMessage(string inString) { string[] fields = new string[64]; fields = inString.Split('\t'); if (fields[0] == "$") { rtbDate.Text = fields[1]; rtbTime.Text = fields[2]; rtbCPFState.Text = fields[3]; rtbComment.Text = fields[4]; if (fields.Length > 6) if (fields[5].Length > 0) rtbCTDPressure.Text = fields[5]; if (fields.Length > 7) if (fields[6].Length > 0) rtbBellowsPosition.Text = fields[6]; if (fields.Length > 8) if (fields[7].Length > 0) rtbBatteryVoltage.Text = fields[7]; if (rtbComment.Text.Contains("PlatVel PID")) parsePIDConstants(rtbComment.Text); if (rtbComment.Text.Contains("Vel PID Values")) parsePIDData(inString); if (rtbComment.Text.Contains("PTH Message")) parsePTH(inString); if (rtbComment.Text.StartsWith("SBE41 Message")) parseSBE41(inString); } } private void parseSBE41(string inString) { string[] fields = new string[64]; fields = inString.Split('\t'); rtbSBE41InString.Text = inString; rtbSBE41RawPressure.Text = fields[20]; rtbSBE41LPFPressure.Text = fields[21]; rtbSBE41LPFVelocity.Text = fields[22]; rtbSBE41DiffVelocity.Text = fields[23]; rtbCTDSamplePeriod.Text = fields[24]; rtbDepth.Text = fields[20]; } private void parsePTH(string inString) { string[] fields = new string[64]; fields = inString.Split('\t'); rtbHousingP.Text = fields[10]; rtbHousingT.Text = fields[11]; rtbHousingH.Text = fields[12]; } private void parsePIDData(string inString) { string[] fields = new string[64]; fields = inString.Split('\t'); rtbPIDSP.Text = fields[25]; rtbPIDPV.Text = fields[26]; rtbPIDY1.Text = fields[27]; rtbPIDY2.Text = fields[28]; rtbPIDI.Text = fields[29]; rtbPIDv.Text = fields[30]; rtbPIDu.Text = fields[31]; rtbPIDuCPS.Text = fields[32]; } private void parsePIDConstants(string comment) { string[] fields = new string[64]; if (comment.Contains("PID K")) { fields = comment.Split('='); rtbPIDK.Text = fields[1]; } if (comment.Contains("PID Ti")) { fields = comment.Split('='); rtbPIDTi.Text = fields[1]; } if (comment.Contains("PID Td")) { fields = comment.Split('='); rtbPIDTd.Text = fields[1]; } if (comment.Contains("PID Tf")) { fields = comment.Split('='); rtbPIDTf.Text = fields[1]; } if (comment.Contains("PID Tt")) { fields = comment.Split('='); rtbPIDTt.Text = fields[1]; } if (comment.Contains("PID B")) { fields = comment.Split('='); rtbPIDB.Text = fields[1]; } if (comment.Contains("PID uLow")) { fields = comment.Split('='); rtbPIDuLow.Text = fields[1]; } if (comment.Contains("PID uHigh")) { fields = comment.Split('='); rtbPIDuHigh.Text = fields[1]; } if (comment.Contains("PID h")) { fields = comment.Split('='); rtbPIDh.Text = fields[1]; } } internal void PinChanged(object sender, SerialPinChangedEventArgs e) { SerialPinChange SerialPinChange1 = 0; bool signalState = false; SerialPinChange1 = e.EventType; lblCTSStatus.BackColor = Color.Green; lblDSRStatus.BackColor = Color.Green; lblRIStatus.BackColor = Color.Green; lblBreakStatus.BackColor = Color.Green; switch (SerialPinChange1) { case SerialPinChange.Break: lblBreakStatus.BackColor = Color.Red; //MessageBox.Show("Break is Set"); break; case SerialPinChange.CDChanged: signalState = ComPort.CtsHolding; // MessageBox.Show("CD = " + signalState.ToString()); break; case SerialPinChange.CtsChanged: signalState = ComPort.CDHolding; lblCTSStatus.BackColor = Color.Red; //MessageBox.Show("CTS = " + signalState.ToString()); break; case SerialPinChange.DsrChanged: signalState = ComPort.DsrHolding; lblDSRStatus.BackColor = Color.Red; // MessageBox.Show("DSR = " + signalState.ToString()); break; case SerialPinChange.Ring: lblRIStatus.BackColor = Color.Red; //MessageBox.Show("Ring Detected"); break; } } private void btnTest_Click(object sender, EventArgs e) { //SerialPinChangedEventHandler1 = new SerialPinChangedEventHandler(PinChanged); //ComPort.PinChanged += SerialPinChangedEventHandler1; //ComPort.Open(); //ComPort.RtsEnable = true; //ComPort.DtrEnable = true; //btnTest.Enabled = false; } private void btnPortState_Click(object sender, EventArgs e) { portState(); } private void portState() { if (btnPortState.Text == "Open Port") { btnPortState.Text = "Close Port"; ComPort.PortName = Convert.ToString(cboPorts.Text); ComPort.PortName = "COM4"; ComPort.BaudRate = Convert.ToInt32(cboBaudRate.Text); ComPort.DataBits = Convert.ToInt16(cboDataBits.Text); ComPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text); ComPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHandShaking.Text); ComPort.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text); ComPort.Open(); } else if (btnPortState.Text == "Close Port") { btnPortState.Text = ""; ComPort.Close(); } } private void rtbOutgoing_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)13) // enter key { ComPort.Write("\r\n"); rtbOutgoing.Text = ""; } else if (e.KeyChar < 32 || e.KeyChar > 126) { e.Handled = true; // ignores anything else outside printable ASCII range } else { ComPort.Write(e.KeyChar.ToString()); } } private void btnHello_Click(object sender, EventArgs e) { ComPort.Write("Hello World!"); } private void btnHyperTerm_Click(object sender, EventArgs e) { string Command1 = txtCommand.Text; string CommandSent; int Length, j = 0; Length = Command1.Length; for (int i = 0; i < Length; i++) { CommandSent = Command1.Substring(j, 1); ComPort.Write(CommandSent); j++; } } private void btnExit_Click(object sender, EventArgs e) { ComPort.Close(); logFile.Close(); Application.Exit(); } private void btnGo_Click(object sender, EventArgs e) { ComPort.Write("$go\r\n"); } private void btnRecoveryTrue_Click(object sender, EventArgs e) { ComPort.Write("$recoveryTrue\r\n"); } private void btnRecoveryFalse_Click(object sender, EventArgs e) { ComPort.Write("$recoveryFalse\r\n"); } private void btnSendExit_Click(object sender, EventArgs e) { ComPort.Write("$exit\r\n"); } private void btnGetDir_Click(object sender, EventArgs e) { ComPort.Write("$getdir\r\n"); } private void btnUpEngr_Click(object sender, EventArgs e) { ComPort.Write("upengr," + nudUpEngr.Value.ToString() + "\r\n"); } } }