Reputation: 311
I have managed to fetch values via RS232 from a temperature sensor. The expected values are to be added to the database for further manipulation. Here is the code.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
using System.IO.Ports;
namespace SimpleSerial
{
public partial class Form1 : Form
{
// Add this variable
MySqlConnection conn = null;
float tempvalue;
string RxString;
public Form1()
{
InitializeComponent();
}
public void dbconnect()
{
string cs = @"server=xxx.x.x.xx;userid=uuuuuu;password=xxxxx;database=project";
try
{
conn = new MySqlConnection(cs);
conn.Open();
MySqlCommand cmd = new MySqlCommand();
cmd.Connection = conn;
cmd.CommandText = "INSERT INTO temp(value) VALUES(@value) ";
cmd.Prepare();
cmd.Parameters.AddWithValue("@value", tempvalue);
cmd.ExecuteNonQuery();
//Console.WriteLine("MySQL version : {0}", conn.ServerVersion);
//MessageBox.Show("DB Connected");
}
catch (MySqlException ex)
{
Console.WriteLine("Error: {0}", ex.ToString());
MessageBox.Show("Error: {0}", ex.ToString());
}
finally
{
if (conn != null)
{
conn.Close();
}
}
}
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = "COM2";
serialPort1.BaudRate = 9600;
serialPort1.Open();
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
textBox1.ReadOnly = false;
}
}
private void buttonStop_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
serialPort1.Close();
buttonStart.Enabled = true;
buttonStop.Enabled = false;
textBox1.ReadOnly = true;
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen) serialPort1.Close();
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
// If the port is closed, don't try to send a character.
if (!serialPort1.IsOpen) return;
// If the port is Open, declare a char[] array with one element.
char[] buff = new char[1];
// Load element 0 with the key character.
buff[0] = e.KeyChar;
// Send the one character buffer.
serialPort1.Write(buff, 0, 1);
// Set the KeyPress event as handled so the character won't
// display locally. If you want it to display, omit the next line.
e.Handled = true;
}
private void DisplayText(object sender, EventArgs e)
{
tempvalue = float.Parse(RxString);
dbconnect();
textBox1.AppendText(RxString);
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
}
}
}
Kindly note:
tempvalue = float.Parse(RxString);
dbconnect();
textBox1.AppendText(RxString);
is the value I would like to manipulate. Current output is like 56.1234557.4323253.34221 . The values of interest are two digits on the left after the every '.'.I would like to get this values has 56 57 53 etc. I have tried round it seems not to be the best option here. Since it is from a serial port, the way the values are read make me loose some bits.
Is there a way I can separate the Xs and Ds in XX.DDDDD and use the XX to populate the database? I have tried RxString.Split('.')
. Maybe I did not do it right. Someone kindly help. Thanks
Upvotes: 0
Views: 436
Reputation: 20320
string[] values = RxString.Split(new Char[] {','});
foreach(String value in values)
{
string[] parts = value.Split(new char[] {'.'});
if (parts.Length == 2)
{
int v;
if (int.TryParse(parts[0], out v))
{
// do something with v
}
}
}
If I get you.
Upvotes: 1
Reputation: 112392
You can use Regex to extract the interesting parts of the string
MatchCollection matches =
Regex.Matches("56.1234557.4323253.34221", @"\d\d(?=\.)");
foreach (Match match in matches) {
Console.WriteLine(match.Value);
}
I used the regex pattern find(?=suffix)
which matches a position preceding a suffix. \d\d
matches two digits and \.
matches the decimal point.
Upvotes: 1