首页 > 解决方案 > 从 C# 中的连续串行通信中捕获特定系列的字节

问题描述

我正在尝试设计一个系统来检查特定的字节顺序,以便在发生连续串行数据传输的网络中请求数据时发送数据。到目前为止,我已经确保了串行数据传输和操作,尽管我还没有成功检查所需的特定字节顺序。我怎样才能做到这一点?

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();
        }
    }
}

标签: c#winformsserial-port

解决方案


推荐阅读