I am trying to design a system that checks for a specific order of bytes in order to send data when it is requested in a network where continuous serial data transmission takes place. So far I have ensured serial data transmission and manipulation though I haven't been successful at checking for the specific order of bytes required. How can I do that?
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Windows.Forms;
namespace WindowsFormsApp2
{
public partial class Form1 : Form
{ //
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
foreach (var seriPort in SerialPort.GetPortNames())
{
comboBoxSerialPorts.Items.Add(seriPort);
}
buttonClose.Enabled = false;
buttonOpen.Enabled = true;
}
private void buttonOpen_Click(object sender, EventArgs e)
{
serialPort1.Parity = Parity.None;
serialPort1.BaudRate = 115200;
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 8;
serialPort1.PortName = comboBoxSerialPorts.Text;
serialPort1.Encoding = System.Text.Encoding.UTF8;
try
{
serialPort1.Open();
}
catch (Exception er)
{
MessageBox.Show($"Bağlantı yapılamadı \n Hata: {er.Message }", "Problem", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
if (serialPort1.IsOpen)
{
buttonClose.Enabled = true;
buttonOpen.Enabled = false;
buttonSend.Enabled = true;
}
}
private void buttonClose_Click(object sender, EventArgs e)
{
serialPort1.Close();
buttonClose.Enabled = false;
buttonOpen.Enabled = true;
buttonSend.Enabled = false;
}
private void buttonSend_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
{
MessageBox.Show(textBoxMessages.Text);
int realdata = Convert.ToInt32(textBoxMyMessage.Text);
string newLine = Environment.NewLine;
realdata += 60;
realdata *= 100;
string hexVal = realdata.ToString("X");
char digi1 = Convert.ToChar(realdata & 0x000F);
byte rdigi1 = (byte)(digi1 >> 0);
char digi2 = Convert.ToChar(realdata & 0x00F0);
byte rdigi2 = (byte)(digi2 >> 4);
char digi3 = Convert.ToChar(realdata & 0x0F00);
byte rdigi3 = (byte)(digi3 >> 8);
char digi4 = Convert.ToChar(realdata & 0xF000);
byte rdigi4 = (byte)(digi4 >> 12);
List<byte> lst = new List<byte>(); //-------------------- Adding Identification constants first
lst.Add((byte)2);
lst.Add((byte)'2');
lst.Add((byte)'2');
lst.Add((byte)'0');
lst.Add((byte)'4'); //--------------------
List<byte> lst2 = new List<byte>(); //-------------------- Adding manipulated data
lst2.Add(rdigi4);
lst2.Add(rdigi3);
lst2.Add(rdigi2);
lst2.Add(rdigi1);
lst.AddRange(lst2);
Console.WriteLine(string.Join("", lst));
textBoxMyMessage.Text = "";
int xor = lst[0] ^ lst[1] ^ lst[2] ^ lst[3] ^ lst[4] ^ lst[5] ^ lst[6] ^ lst[7] ^ lst[8]; //--------------- Creation of the main xor byte and its division into two
char xor0 = Convert.ToChar(xor & 0x0F);
byte rxor0 = (byte)(xor0 >> 0);
char xor1 = Convert.ToChar(xor & 0xF0);
byte rxor1 = (byte)(xor1 >> 4);
lst.Add(rxor0);
lst.Add(rxor1);
lst.Add(0x03);
for (int n = 0; n < 12; n++)
{
textBoxMyMessage.Text += $"{lst[n]} ";
}
//textBoxMyMessage.Text += $" { newLine}";
//textBoxMyMessage.Text += "21321341234";
//--------------------------------------------------------------|
serialPort1.Write(textBoxMyMessage.Text);
textBoxMyMessage.Clear();
}
}
public delegate void goster(String s);
public void Yaz(string s)
{
string newLine = Environment.NewLine;
int realdata = Convert.ToInt32(s);
realdata += 60;
realdata *= 100;
string hexVal = realdata.ToString("X");
byte digi1 = Convert.ToByte(realdata & 0x000F);
byte rdigi1 = (byte)(digi1 >> 0);
string hexVal1 = digi1.ToString("X");
byte digi2 = Convert.ToByte(realdata & 0x00F0);
byte rdigi2 = (byte)(digi2 >> 4);
string hexVal2 = rdigi2.ToString("X");
int digi3 = (realdata & 0x0F00);
byte rdigi3 = (byte)(digi3 >> 8);
string hexVal3 = rdigi3.ToString("X");
int digi4 = (realdata & 0xF000); // use and with respective digit position in order gain the needed part
byte rdigi4 = (byte)(digi4 >> 12); // each int character consists of 4 bits, we are shifting in order to move the needed part to the first order
string hexVal4 = rdigi4.ToString("X"); // change in order to represent as a hex string
string datafin = hexVal4 + hexVal3 + hexVal2 + hexVal1; //string representation for the combined data
List<byte> tr_buf = new List<byte>();
tr_buf.Add((byte)2);
tr_buf.Add((byte)'2');//str //-----------
tr_buf.Add((byte)'2');//id
tr_buf.Add((byte)'0');//rn
tr_buf.Add((byte)'4');//dl
List<byte> newlst = new List<byte>();
newlst.Add(rdigi4);
newlst.Add(rdigi3);
newlst.Add(rdigi2);
newlst.Add(rdigi1);
tr_buf.AddRange(newlst);
Console.WriteLine(string.Join("", tr_buf));
for (int i = 0; i < 9; i++)
{
textBoxMessages.Text += $"{tr_buf[i]}" ;
}
textBoxMessages.Text += $" { newLine}";
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string gelenveri = serialPort1.ReadExisting();
textBoxMessages.Invoke(new goster(Yaz), gelenveri);
}
private void button1_Click(object sender, EventArgs e)
{
textBoxMessages.Clear();
}
}
}