110,567
社区成员
发帖
与我相关
我的任务
分享
int n = comm.BytesToRead;
byte[] buf = new byte[n];
received_count = n;//增加接收计数
comm.Read(buf, 0, n);//读取缓冲数据
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count = n;//增加接收计数
builder.Length=0;//清除字符串构造器的内容
//<协议解析>
bool data_1_catched = false;//缓存记录数据是否捕获到
buffer.AddRange(buf);
private void button1_Click(object sender, EventArgs e)
{
int n = 0;
comm.Encoding = System.Text.Encoding.Unicode;
//16进制发送
if (checkBox1.Checked)
{
//处理数字转换,目的是将输入的字符按空格、“,”等分组,以便发送数据时的方便(此处转的比较麻烦,有高见者,请指点!)
comm.RtsEnable = true;
Thread.Sleep(2);
comm.Parity = Parity.Mark;
//转换列表为数组后发送
byte[] send1 = { 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
comm.Write(send1, 0, send1.Length);
Thread.Sleep(50);
comm.RtsEnable = false;
Thread.Sleep(2);
comm.Parity = Parity.Mark;
//处理数字转换,目的是将输入的字符按空格、“,”等分组,以便发送数据时的方便(此处转的比较麻烦,有高见者,请指点!)
comm.RtsEnable = true;
Thread.Sleep(2);
comm.Parity = Parity.Mark;
//转换列表为数组后发送
byte[] send2 = { 0xaa, 0xaa, 0x01, 0x01, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00 };
comm.Write(send2, 0, send2.Length);
Thread.Sleep(50);
comm.RtsEnable = false;
Thread.Sleep(10);
comm.Parity = Parity.Mark;
}
else//ascii编码直接发送
{
//包含换行符
if (checkBox2.Checked)
{
comm.WriteLine(richTextBox2.Text);
// n = txSend.Text.Length + 2;
}
else//不包含换行符
{
comm.Write(richTextBox2.Text);
//n = txSend.Text.Length;
}
}
}
下面是我的接收代码
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
comm.Parity = Parity.Mark;
comm = (SerialPort)sender;
string s100 = "";
Thread.Sleep(500);//此处一定要有,休眠一段 时间利用缓存来接收数据,经测试75秒刚好
if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
received_count = 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 += Convert.ToString(buf[i],16);
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());
comm.DiscardInBuffer();
}));
}
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
}
}
//转换列表为数组后发送
通讯协议是这样的:软件先向下位机下发0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 这几个数据,说明我要开始下发数据了,然后再下发0xaa, 0xaa, 0x01, 0x01, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00说明这是我下发的指令,下位机接收到了0xaa, 0xaa, 0x01, 0x01, 0x01, 0x08, 0x00, 0x00, 0x00, 0x00指令以后会回传数据,