JohnOz Ответов: 1

Как я могу сделать циклический буфер на этом коде?


Привет,ребята, я написал код о последовательной связи, и я хочу отправлять данные и получать данные.Отправить часть данных-это правильно, но я должен сделать круговой буфер приема части данных.Я сделал что-то, к сожалению, после загрузки входящих данных это остановилось, потому что код не мог найти правильный заголовок.В результате я не мог его круговым буфером назвать.Как вы можете мне помочь?Извините за мой английский.С наилучшими пожеланиями.

Что я уже пробовал:

namespace SeriPort {     //Established by Can �z     public partial class Form1 : Form     {         int i = 0;         int offsetIndex = 0;         byte[] sentData = new byte[43];         byte[] message = new byte[43];         byte[] byte_buffer = new byte[131072];         int Freq = 0;         int receivedValidMessageCounter = 0;         //string deneme = "";         int lastDataReceived=0;         public Form1()         {             CheckForIllegalCrossThreadCalls = false;             InitializeComponent();                     }         private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)         {             int bufferSize = serialPort1.BytesToRead;             if (bufferSize > 0 && offsetIndex + message.Length < byte_buffer.Length)             {                 serialPort1.Read(byte_buffer, offsetIndex, message.Length);                 offsetIndex = offsetIndex + message.Length;//Reading Index             }             else {                 int lastDataReceived = byte_buffer.Length - offsetIndex;                 serialPort1.Read(byte_buffer, offsetIndex, lastDataReceived);                 offsetIndex = 0;                 //i = 0;                 serialPort1.Read(byte_buffer, offsetIndex, message.Length - lastDataReceived);             }         }         private void button2_Click(object sender, EventArgs e)         {             textBox2.Text = textBox2.Text.ToString().Replace(".", ",");             textBox3.Text = textBox3.Text.ToString().Replace(".", ",");             textBox4.Text = textBox4.Text.ToString().Replace(".", ",");             textBox5.Text = textBox5.Text.ToString().Replace(".", ",");             textBox6.Text = textBox6.Text.ToString().Replace(".", ",");             textBox7.Text = textBox7.Text.ToString().Replace(".", ",");             textBox8.Text = textBox8.Text.ToString().Replace(".", ",");             textBox9.Text = textBox9.Text.ToString().Replace(".", ",");             textBox10.Text = textBox10.Text.ToString().Replace(".", ",");             textBox11.Text = textBox11.Text.ToString().Replace(".", ",");                 sentData[0] = 0xC1;                 sentData[1] = 1;                 for (int f = 0; f < 4; f++)                 {                     float temp1 = Convert.ToSingle(textBox2.Text);                     byte[] data1 = BitConverter.GetBytes(temp1);                     sentData[5 - f] = data1[f];                     float temp2 = Convert.ToSingle(textBox3.Text);                     byte[] data2 = BitConverter.GetBytes(temp2);                     sentData[9 - f] = data2[f];                     float temp3 = Convert.ToSingle(textBox4.Text);                     byte[] data3 = BitConverter.GetBytes(temp3);                     sentData[13 - f] = data3[f];                     float temp4 = Convert.ToSingle(textBox5.Text);                     byte[] data4 = BitConverter.GetBytes(temp4);                     sentData[17 - f] = data4[f];                     float temp5 = Convert.ToSingle(textBox6.Text);                     byte[] data5 = BitConverter.GetBytes(temp5);                     sentData[21 - f] = data5[f];                     float temp6 = Convert.ToSingle(textBox7.Text);                     byte[] data6 = BitConverter.GetBytes(temp6);                     sentData[25 - f] = data6[f];                     float temp7 = Convert.ToSingle(textBox8.Text);                     byte[] data7 = BitConverter.GetBytes(temp7);                     sentData[29 - f] = data7[f];                     float temp8 = Convert.ToSingle(textBox9.Text);                     byte[] data8 = BitConverter.GetBytes(temp8);                     sentData[33 - f] = data8[f];                     float temp9 = Convert.ToSingle(textBox10.Text);                     byte[] data9 = BitConverter.GetBytes(temp9);                     sentData[37 - f] = data9[f];                     float temp10 = Convert.ToSingle(textBox11.Text);                     byte[] data10 = BitConverter.GetBytes(temp10);                     sentData[41 - f] = data10[f];                 }                                             sentData[42] = CalCheckSum(sentData);                 serialPort1.Write(sentData, 0, 43);                    }         private void timer2_Tick(object sender, EventArgs e)         {             if (offsetIndex + message.Length < byte_buffer.Length)             {                 try                 {                     while (IsReceivedMessageValid())                     {                         for (int t = 0; t < message.Length; t++)                         {                             message[t] = byte_buffer[i + t];                         }                         float message1 = System.BitConverter.ToSingle(message, 2);                         textBox12.Text = message1.ToString();                         float message2 = System.BitConverter.ToSingle(message, 6);                         textBox13.Text = message2.ToString();                         float message3 = System.BitConverter.ToSingle(message, 10);                         textBox14.Text = message3.ToString();                         float message4 = System.BitConverter.ToSingle(message, 14);                         textBox15.Text = message4.ToString();                         float message5 = System.BitConverter.ToSingle(message, 18);                         textBox16.Text = message5.ToString();                         float message6 = System.BitConverter.ToSingle(message, 22);                         textBox17.Text = message6.ToString();                         float message7 = System.BitConverter.ToSingle(message, 26);                         textBox18.Text = message7.ToString();                         float message8 = System.BitConverter.ToSingle(message, 30);                         textBox19.Text = message8.ToString();                         float message9 = System.BitConverter.ToSingle(message, 34);                         textBox20.Text = message9.ToString();                         float message10 = System.BitConverter.ToSingle(message, 38);                         textBox21.Text = message10.ToString();                         receivedValidMessageCounter++;                         Freq++;                         if (i < byte_buffer.Length - 44)                         {                             i = i + message.Length;                         }                         this.Text = "Frequency: " + Freq.ToString() + "Hz" + "- TotalDataReceived:" + receivedValidMessageCounter.ToString();                     }                 }                 catch                 {                     while (IsReceivedMessageValid2())                     {                         for (int t = 0; t < lastDataReceived; t++)                         {                             message[t] = byte_buffer[i + t];                         }                         for (int v = 0; v < message.Length - lastDataReceived; v++, lastDataReceived++)                         {                             message[lastDataReceived] = byte_buffer[v];                         }                         float message1 = System.BitConverter.ToSingle(message, 2);                         textBox12.Text = message1.ToString();                         float message2 = System.BitConverter.ToSingle(message, 6);                         textBox13.Text = message2.ToString();                         float message3 = System.BitConverter.ToSingle(message, 10);                         textBox14.Text = message3.ToString();                         float message4 = System.BitConverter.ToSingle(message, 14);                         textBox15.Text = message4.ToString();                         float message5 = System.BitConverter.ToSingle(message, 18);                         textBox16.Text = message5.ToString();                         float message6 = System.BitConverter.ToSingle(message, 22);                         textBox17.Text = message6.ToString();                         float message7 = System.BitConverter.ToSingle(message, 26);                         textBox18.Text = message7.ToString();                         float message8 = System.BitConverter.ToSingle(message, 30);                         textBox19.Text = message8.ToString();                         float message9 = System.BitConverter.ToSingle(message, 34);                         textBox20.Text = message9.ToString();                         float message10 = System.BitConverter.ToSingle(message, 38);                         textBox21.Text = message10.ToString();                         receivedValidMessageCounter++;                         Freq++;                         i = message.Length - lastDataReceived;                         this.Text = "Frequency: " + Freq.ToString() + "Hz" + "- TotalDataReceived:" + receivedValidMessageCounter.ToString();                     }                 }                 /* else                  {                      while (IsReceivedMessageValid2())                      {                          for (int t = 0; t < lastDataReceived; t++)                          {                              message[t] = byte_buffer[i + t];                          }                          for (int v = 0; v < message.Length - lastDataReceived; v++, lastDataReceived++)                          {                              message[lastDataReceived] = byte_buffer[v];                          }                          float message1 = System.BitConverter.ToSingle(message, 2);                          textBox12.Text = message1.ToString();                          float message2 = System.BitConverter.ToSingle(message, 6);                          textBox13.Text = message2.ToString();                          float message3 = System.BitConverter.ToSingle(message, 10);                          textBox14.Text = message3.ToString();                          float message4 = System.BitConverter.ToSingle(message, 14);                          textBox15.Text = message4.ToString();                          float message5 = System.BitConverter.ToSingle(message, 18);                          textBox16.Text = message5.ToString();                          float message6 = System.BitConverter.ToSingle(message, 22);                          textBox17.Text = message6.ToString();                          float message7 = System.BitConverter.ToSingle(message, 26);                          textBox18.Text = message7.ToString();                          float message8 = System.BitConverter.ToSingle(message, 30);                          textBox19.Text = message8.ToString();                          float message9 = System.BitConverter.ToSingle(message, 34);                          textBox20.Text = message9.ToString();                          float message10 = System.BitConverter.ToSingle(message, 38);                          textBox21.Text = message10.ToString();                          receivedValidMessageCounter++;                          Freq++;                          i = message.Length - lastDataReceived;                          this.Text = "Frequency: " + Freq.ToString() + "Hz" + "- TotalDataReceived:" + receivedValidMessageCounter.ToString();                      }                  }*/                 Freq = 0;             }         }         private bool IsReceivedMessageValid()         {                       if (byte_buffer[i] == 0xFA && byte_buffer[i + 1] == 0x01)             {                 byte control = 0x00;                 for (int l = 0; l < message.Length - 1; l++)                 {                     control += byte_buffer[i + l];                                     }                 if (control == byte_buffer[i + message.Length - 1])                     control = Convert.ToByte(256 - control);                     return true;             }             if (i <= byte_buffer.Length-1)                 {                 i++;//write index                 }             return false;         }         private bool IsReceivedMessageValid2() {             if (byte_buffer[i] == 0xFA && byte_buffer[i + 1] == 0x01)             {                 byte control = 0x00;                 for (int l = 0; l < lastDataReceived; l++)                 {                     control += byte_buffer[i + l];                                     }                                 for (int d = 0; d < message.Length - lastDataReceived-1; d++)                 {                     control += byte_buffer[d];                                     }                 if (control == byte_buffer[message.Length - lastDataReceived-1 ])                     return true;             }             if (i <= byte_buffer.Length)             {                 i++;//write index             }             return false;         }         private void Form1_Load(object sender, EventArgs e)         {             string[] portlar = SerialPort.GetPortNames();             comboBox1.Items.AddRange(portlar);             textBox1.Text = Properties.Settings.Default.textbox;             //comboBox1.Text = Properties.Settings.Default.combobox;             if (comboBox1.Items.Contains(Properties.Settings.Default.combobox))                 comboBox1.SelectedIndex = comboBox1.Items.IndexOf(Properties.Settings.Default.combobox);         }         bool c = false;         private void button1_Click(object sender, EventArgs e)         {             if (c)             {                 c = false;                 button1.Text = "Start";                 textBox1.ReadOnly = false;                 comboBox1.Enabled = true;                 label9.Text = "Paused";                 label9.ForeColor = Color.Red;                 if (serialPort1.IsOpen)                 {                     serialPort1.Close();                 }                 else { }                                 timerReceive.Stop();             }             else             {                 c = true;                 try                 {                     //serialPort1 = new SerialPort();                     serialPort1.PortName = comboBox1.Text;                     serialPort1.BaudRate = Convert.ToInt32(textBox1.Text);                     serialPort1.DataBits = 8;                     serialPort1.Parity = Parity.None;                     serialPort1.StopBits = StopBits.One;                     if (!serialPort1.IsOpen)                     {                         serialPort1.Open();                     }                     else                     {                     }                     button1.Text = "Stop";                     textBox1.ReadOnly = true;                     comboBox1.Enabled = false;                     label9.Text = "Sending...";                     label9.ForeColor = Color.Green;                     timerReceive.Start();                 }                 catch                 {                     MessageBox.Show("Please enter number", "Error");                     c = false;                 }             }         }         private void Form1_FormClosed(object sender, FormClosedEventArgs e)         {             if (checkBox1.Checked)             {                 Properties.Settings.Default.textbox = textBox1.Text;                 Properties.Settings.Default.combobox = comboBox1.Text;                 Properties.Settings.Default.Save();             }             else { }         }                 static private byte CalCheckSum(byte[] sentData)         {             byte _CheckSumByte = 0x00;             for (int a = 0; a < sentData.Length - 1; a++)                 _CheckSumByte += sentData[a];             _CheckSumByte = Convert.ToByte(256 - _CheckSumByte);             return _CheckSumByte;         } 

OriginalGriff

Никто - но никто - не собирается пробираться через эту кучу неформатированного беспорядка "одна строка кода", чтобы понять, что вы кодируете, возможно, делаете, и какие проблемы вы можете встретить, делая это. Отредактируйте его и замените правильно отформатированным кодом, который мы можем прочитать. И сократите его только до соответствующих фрагментов - мы не хотим тратить время на просмотр всего приложения, даже если оно отформатировано, пытаясь понять, где вы можете что-то делать.

Так что расскажите нам, что вы пробовали, где застряли.
Помогите нам помочь вам!
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

1 Ответов

Рейтинг:
0

CPallini

  • Правильно сделайте отступ в коде. Я с трудом верю, что кто-то будет смотреть на этот беспорядок опубликованного кода.
  • Сосредоточьтесь на захвате сообщения, сделайте его пуленепробиваемым. Это обязательное условие. Для выполнения этой задачи вы можете использовать очень большой буфер (чтобы избежать попадания в круговой предел буфера).
  • Рассмотрите возможность использования готовой реализации циклического буфера (многие из них вы можете найти в интернете.