int len = n - 8; if (buffer.Count < len + 8) break; else { byte checksum = 0; for (int i = 2; i <len + 7; i++) { checksum ^= buffer[i]; } if (checksum != buffer[len + 7]) { buffer.RemoveRange(0, len + 8); continue; } else { buffer.CopyTo(0, Hex_data_1, 0, len + 8);
} }
data_1_catched = true; buffer.RemoveRange(0, len + 8);
} else {
buffer.RemoveAt(0); }
}
builder.Clear();//清除字符串构造器的内容 //因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判断是否是显示为16进制 if (checkBoxHexView.Checked) { //依次的拼接出16进制字符串 foreach (byte b in buf) // foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); string bStr = b.ToString("X2"); if (bStr == "FF" || bStr == "EF") { builder.Append("\r\n"); } } } else { //直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,并滚动到最后。 string temp = buffer.ToString(); string result=""; for (int m = 0; m <=n; m++) {
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (IsClosing)
return;
try
{
Listening = true;
int n = comm.BytesToRead;
byte[] buf = new byte[n];
received_count += n;
comm.Read(buf, 0, n);//读取缓冲数据
bool data_1_catched = false;//缓存记录数据是否捕获到
buffer.AddRange(buf);
while (buffer.Count >= 8)
{
if (buffer[0] ==0x16 && buffer[1] == 0x16 && buffer[2] == 0x01 && buffer[3] == 0x30
&& buffer[4] == 0x30 && buffer[5] == 0x02 && buffer[62]==0x03)
{
int len = n - 8; if (buffer.Count < len + 8)
break;
else
{
byte checksum = 0;
for (int i = 2; i <len + 7; i++)
{
checksum ^= buffer[i];
}
if (checksum != buffer[len + 7])
{
buffer.RemoveRange(0, len + 8); continue;
}
else
{
buffer.CopyTo(0, Hex_data_1, 0, len + 8);
}
}
data_1_catched = true;
buffer.RemoveRange(0, len + 8);
}
else
{
buffer.RemoveAt(0);
}
}
builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
//判断是否是显示为16进制
if (checkBoxHexView.Checked)
{
//依次的拼接出16进制字符串
foreach (byte b in buf)
// foreach (byte b in buf)
{
builder.Append(b.ToString("X2") + " ");
string bStr = b.ToString("X2");
if (bStr == "FF" || bStr == "EF")
{
builder.Append("\r\n");
}
}
}
else
{
//直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf));
}
//追加的形式添加到文本框末端,并滚动到最后。
string temp = buffer.ToString();
string result="";
for (int m = 0; m <=n; m++)
{
result = result + Convert.ToString(buffer[m]);
}
txGet.Text = result;
//修改接收计数
labelGetCount.Text = "Get:" + received_count.ToString();
}));
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了
}
}
int n = comm.BytesToRead; 我想请教一下上面的代码,我调用ByteToRead成员时抛出“端口已关闭”的异常,可能是什么原因。我加入监视,其实在调用ByteToRead前端口都是打开的。