C#串口接收问题
给位大侠,我有一个串口接收问题,每次给单片机发送数据,然后让单片机回发同样的数据给我,用于显示在文本框中,可是我发现当用调试运行的时候数据可以正常显示,但不用调试直接运行时数据就不能正常显示,小弟真不知错在哪儿,以下是我的程序,希望各位不惜指正一下,感激不尽
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
buffer.Clear();
Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
comm.Read(buf, 0, n);//读取缓冲数据
//<协议解析>
buffer.AddRange(buf);
bool data_1_catched = false;//缓存记录数据是否捕获到
//2.完整性判断
zs_sjzhen = new byte[buffer.Count];
if (buffer.Count >= 4)//至少要包含头(1字节)+命令(1字节)+长度(1字节)+校验(1字节)
{
//2.1 查找数据头
if (buffer[0] == 0x7E)
{
byte checksum = 0;
for (int i = 0; i < buffer.Count-1; i++)//7表示校验之前的位置
{
checksum ^= buffer[i];
}
//至此,已经被找到了一条完整数据。我们将数据直接分析,或是缓存起来一起分析
buffer.CopyTo(0, zs_sjzhen, 0, buffer.Count);//复制一条完整数据到具体的数据缓存
data_1_catched = true;
buffer.RemoveRange(0, buffer.Count);//正确分析一条数据,从缓存中移除数据。
}
else
{
//这里是很重要的,如果数据开始不是头,则删除数据
buffer.RemoveAt(0);
}
}
//分析数据
if (data_1_catched)
{
builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
//依次的拼接出16进制字符串
foreach (byte b in zs_sjzhen)
{
builder.Append(b.ToString("X2") + " ");
}
//this.richTextBox1.AppendText(builder.ToString());
data_1_catched = false;
}));
this.Invoke((EventHandler)(delegate
{
this.richTextBox1.AppendText(builder.ToString());
// JYT_StartRunning();
}));
}
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
}
}
------解决方案--------------------
参考你1L的说法,应该是数据还没有到吧。处理下时间问题。