读书人

C#串口通信从缓存中取出的数据的有关问

发布时间: 2013-03-28 10:20:24 作者: rapoo

C#串口通信从缓存中取出的数据的问题
本人用C#刚接触串口通信不久,在网上找了一些串口通信的资料,按照资料中的讲解做了个串口通信程序,但是在和下位机通信的时候接收到的数据总是不对,不知道是什么原因,哪位懂C#串口通信的大侠能指点下吗?
正确的数据格式应该是这样的:F0 55 AA 04 07 0D 01 00 02 00 03 00 04 0D 00 0F 00 13 00 04 00 14 00 98 00 03 00 0B 00 83 00 7C 00 07 00 7F 00 80 00 88 9C 9C 但是不知道为什么我用程序中的代码接收到的数据格式却是这样的:AA AA 00 00 00 00 00 00 00 AA AA 04 04 04 0F 00 00 00 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 。哪位大侠能告诉我问题出在哪里吗?
下面是我的发送程序的代码:
//处理数字转换,目的是将输入的字符按空格、“,”等分组,以便发送数据时的方便(此处转的比较麻烦,有高见者,请指点!)
comm.RtsEnable = true;
//comm.Parity = Parity.Mark;
Thread.Sleep(2);
// comm.Parity = Parity.Mark;




byte[] byteBuffer2 = new byte[9];
byteBuffer2[0] = 0xaa;
byteBuffer2[1] = 0xaa;
byteBuffer2[2] = 0x04;
byteBuffer2[3] = 0x04;
byteBuffer2[4] = 0x04;
byteBuffer2[5] = 0x0f;
byteBuffer2[6] = 0x00;
byteBuffer2[7] = 0x00;
byteBuffer2[8] = 0x00;

String strSend2 = byteBuffer2[0].ToString("X2") + " " + byteBuffer2[1].ToString("X2") + " " + byteBuffer2[2].ToString("X2") + " " + byteBuffer2[3].ToString("X2") + " " + byteBuffer2[4].ToString("X2") + " " +
byteBuffer2[5].ToString("X2") + " " + byteBuffer2[6].ToString("X2") + " " + byteBuffer2[7].ToString("X2") + " " + byteBuffer2[8].ToString("X2");



string sendBuf2 = strSend2;
string sendnoNull2 = sendBuf2.Trim();
string sendNOComma6 = sendnoNull2.Replace(',', ' '); //去掉英文逗号
string sendNOComma7 = sendNOComma6.Replace(',', ' '); //去掉中文逗号
string strSendNoComma8 = sendNOComma7.Replace("0x", ""); //去掉0x
strSendNoComma8.Replace("0X", ""); //去掉0X
string[] strArray2 = strSendNoComma8.Split(' ');

List<byte> buf2 = new List<byte>();//填充到这个临时列表中
//依次添加到列表中
int byteBufferLength2 = strArray2.Length;
for (int i = 0; i < strArray2.Length; i++)
{
byte str2 = byte.Parse(strArray2[i].ToString(), System.Globalization.NumberStyles.HexNumber);
buf2.Add(str2);

}

//转换列表为数组后发送

comm.Write(buf2.ToArray(), 0, buf2.Count);
Thread.Sleep(60);

comm.RtsEnable = false;
//Thread.Sleep(16);
comm.Parity = Parity.Mark;

接收部分的代码如下
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

//更新界面
//this.Invoke((EventHandler)(delegate { richTextBox1.Text = ""; }));


//buffer.RemoveAt(0);
Thread.Sleep(500);//此处一定要有,休眠一段 时间利用缓存来接收数据,经测试75秒刚好
if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count = n;//增加接收计数
//richTextBox3.Text = received_count.ToString();
//MessageBox.Show(received_count.ToString());
comm.Read(buf, 0, n);//读取缓冲数据
builder.Length=0;//清除字符串构造器的内容

//<协议解析>
bool data_1_catched = false;//缓存记录数据是否捕获到
buffer.AddRange(buf);
if (buffer.Count >=9)
{
string data,data1;
data = "";
data1 = "";
//MessageBox.Show(buf[8].ToString("X2"));
for (int i = 0; i < n; i++)
{
data1 += buffer[i].ToString("X2") + " ";
data += buf[i].ToString("X2") + " ";
// data = n.ToString();
}


//更新界面
this.Invoke((EventHandler)(delegate { richTextBox4.Text = data; }));
this.Invoke((EventHandler)(delegate { richTextBox3.Text = data; }));
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
//判断是否是显示为16禁止
if (checkBox3.Checked)
{
//依次的拼接出16进制字符串
foreach (byte b in buf)
{
builder.Append(b.ToString("X2") + " ");
}
}
else
{
//直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf));
}
//追加的形式添加到文本框末端,并滚动到最后。
richTextBox1.AppendText(builder.ToString());
// richTextBox1.Text=builder.ToString();
//修改接收计数


//labelGetCount.Text = "Get:" + received_count.ToString();
}));

}



}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
}

}
[解决办法]
帮你顶下
那么多3F可能是由于发送了ASCII码以外的字符,但是却是以ASCII码的形式发送的,导致编码为“?”,对应ASCII值为3F

读书人网 >C#

热点推荐