自己用VS2013 C#编了一个类似串口助手的上位机现在出现以下问题
1.调试时未出现卡死任何问题,生成后点击传送数据没问题,但是不断发送就会直接卡死
自己分析:1.我每次传送36个字节,波特率9600
数据量太大
2.程序没有及时释放存储空间,导致卡死
3.程序处理的时间太长,导致处理不够及时
我大致搜了一下,他们说需要用一个线程。具体没学过C#,只是照着,查着学的。请高手帮我想想方法
以下是部分程序
串口接收事件:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (!radioButton3.Checked)
{
textBox1.AppendText(serialPort1.ReadExisting()); //串口类会自动处理汉字,所以不需要特别转换
}
else
{
try
{
byte[] data = new byte[serialPort1.BytesToRead]; //定义缓冲区,因为串口事件触发时有可能收到不止一个字节
serialPort1.Read(data, 0, data.Length);
if (Displayer != null)
Displayer.AddData(data); //!!!!!
foreach (byte Member in data) //遍历用法
{
string str = Convert.ToString(Member, 16).ToUpper();
textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
}
}
catch { }
}
}
以下是数据处理:
public void AddData(byte[] Data)
{
if (Flag == 1)
{
for (int i = 0; i < Data.Length; i++)
DataList.Add(Data[i]);//链表尾部添加数据
if (DataList.Count - 1 >= (this.ClientRectangle.Width - StartPrint - 240) / DrawStep)//如果数据量大于可容纳的数据量,即删除最左数据
{
DataList.RemoveRange(0, 35);
}
data_get();
}
Invalidate();//刷新显示
}
public void data_get()
{
for (int i = DataList.Count -36 ; i < DataList.Count - 1; i++) //数据包分配
{
if( DataList[i] == 0x50 )
{
switch(DataList[i+1])
{
case 0x56:
{
for (int j = 0; j < 4; j++)
{
Now_Data[j] = DataList[i + 2 + j]; //实时值数组
}
break;
}
case 0x51:
{
for (int j = 0; j < 4; j++)
{
fData[j] = DataList[i + 2 + j]; //目标值数据
}
break;
}
case 0x52:
{
for (int j = 0; j < 4; j++)
{
P_Data[j] = DataList[i + 2 + j]; //P数据
}
break;
}
case 0x53:
{
for (int j = 0; j < 4; j++)
{
I_Data[j] = DataList[i + 2 + j];
}
break;
}
case 0x54:
{
for (int j = 0; j < 4; j++)
{
D_Data[j] = DataList[i + 2 + j];
}
break;
}
case 0x55:
{
for (int j = 0; j < 4; j++)
{
PWM_Data[j] = DataList[i + 2 + j];
}
break;
}
}
}
}
N_val[0]= BitConverter.ToSingle(Now_Data, 0); //以下为byte转化为float类型
Goal_val = BitConverter.ToSingle(fData, 0);
P_val = BitConverter.ToSingle(P_Data, 0);
I_val = BitConverter.ToSingle(I_Data, 0);
D_val = BitConverter.ToSingle(D_Data, 0);
PWM_val = BitConverter.ToSingle(PWM_Data, 0);
if (N_Data.Count - 1 >= (this.ClientRectangle.Width - StartPrint - 240) / DrawStep)//如果数据量大于可容纳的数据量,即删除最左数据
{
N_Data.RemoveRange(0, 5);
}
N_Data.Add(N_val[0]);
textBox10.Text = (N_val[0]).ToString(); //以下为文本显示
textBox11.Text = Goal_val.ToString();
textBox12.Text = PWM_val.ToString();
textBox16.Text = P_val.ToString();
textBox17.Text = I_val.ToString();
textBox15.Text = D_val.ToString();
}