在串口通信发送程序中怎样编写异或校验程序???

qlu0634 2008-09-19 10:52:33
我现在想做一个给PLC发送程序,步骤是:当按下发送按钮时,先从TestBox接受数据(16进制的)后转化为一个BYTE数组a,然后计算出数组a的长度,然后在程序中再定义一个BYTE数组b,b[0]是起始字节16进制“0”,b[1]是上一个数组的字节数,即从TestBox接收到的字节数。然后从b[2]一直到b[a.Length+2]为发送数据,b[a.Length+3]是校验码,校验码是异或校验:即把数组b中从b[1]开始到b[a.Length+2]的各字节的异或和。b[a.Length+4]定义为结束字节16进制的“FF”。然后打开串口发送b到PLC。步骤就是这样,只是我不会用C#我是新手,希望那位大哥能编出程序来小弟万分感谢啦!!分不多但是希望各位论坛的同仁能帮小弟一把!!
...全文
841 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdgphc 2008-09-19
  • 打赏
  • 举报
回复
private void button3_Click(object sender, EventArgs e)
{
if (richTextBox2.Text == "")
{
MessageBox.Show("请检查输入!");
}
byte[] a = System.Text.Encoding.Default.GetBytes(richTextBox2.Text);
byte[] buf = new byte[a.Length + 5]; //你描述的应该是a.length+4 啊,为什么加5 a.CopyTo(buf, 3); //为什么从第3个复制,有了这行,为啥还要桔色那行
int count = a.Length;
buf[0] = 0;
buf[1] = Convert.ToByte(count);
Byte fcs = buf[1];
for (int i = 2; i <= count; i++)
{
buf[i] = a[i - 2];
fcs ^= Convert.ToByte(buf[i]);
}
buf[a.Length + 3] = fcs;
buf[a.Length + 4] = Convert.ToByte("FF", 16); //直接写buf[a.Length+4]=0xFF; 就行
this.serialPort1.Write(buf, 0, a.Length+5); //从来没给最后一位赋值啊.
}
wdgphc 2008-09-19
  • 打赏
  • 举报
回复
private void button3_Click(object sender, EventArgs e)
{
if (richTextBox2.Text == "")
{
MessageBox.Show("请检查输入!");
}
byte[] a = System.Text.Encoding.Default.GetBytes(richTextBox2.Text);
byte[] b = new byte[a.Length + 5]; //你描述的应该是a.length+4 啊,为什么加5
a.CopyTo(buf, 3); //为什么从第3个复制,有了这行,为啥还要桔色那行
int count = a.Length;
buf[0] = 0;
buf[1] = Convert.ToByte(count);
Byte fcs = buf[1];
for (int i = 2; i <= count; i++)
{
buf[i] = a[i - 2];
fcs ^= Convert.ToByte(buf[i]);
}
buf[a.Length + 3] = fcs;
buf[a.Length + 4] = Convert.ToByte("FF", 16); //直接写buf[a.Length+4]=0xFF; 就行
this.serialPort1.Write(buf, 0, a.Length+5); //从来没给最后一位赋值啊.
}
wdgphc 2008-09-19
  • 打赏
  • 举报
回复
你程序中的变量 a,data ; b,buf 怎么写的那么乱啊?
qlu0634 2008-09-19
  • 打赏
  • 举报
回复
我自己大致编了一个,可是通信还是不行,请指教那个地方有问题?、程序如下:

private void button3_Click(object sender, EventArgs e)
{
if (richTextBox2.Text == "")
{
MessageBox.Show("请检查输入!");
}
byte[] a = System.Text.Encoding.Default.GetBytes(richTextBox2.Text);
byte[] b = new byte[data.Length + 5];
a.CopyTo(buf, 3);
int count = a.Length;
buf[0] = 0;
buf[1] = Convert.ToByte(count);
Byte fcs = buf[1];
for (int i = 2; i <= count; i++)
{
buf[i] = a[i - 2];
fcs ^= Convert.ToByte(buf[i]);
}
buf[a.Length + 3] = fcs;
buf[a.Length + 4] = Convert.ToByte("FF", 16);
this.serialPort1.Write(buf, 0, a.Length+5);
}
qlu0634 2008-09-19
  • 打赏
  • 举报
回复
谢谢啦 非常感谢您!!
wdgphc 2008-09-19
  • 打赏
  • 举报
回复
private void button3_Click(object sender, EventArgs e)
{
if (richTextBox2.Text == "")
{
MessageBox.Show("请检查输入!");
}
byte[] a = System.Text.Encoding.Default.GetBytes(richTextBox2.Text);
byte[] b = new byte[a.Length + 4];
a.CopyTo(b, 2); //从第3个元素开始copy,但下标应为2
int count = a.Length;
b[0] = 0;
b[1] = Convert.ToByte(count);
Byte fcs = b[1];
for (int i = 2; i < count + 2; i++) //从2到count+2 ,不能用=号.这样才能正确循环count次
{
fcs ^= Convert.ToByte(b[i]);
}
b[count + 2] = fcs; //下标错误
b[count + 3] = 0xFF; //下标错误
this.serialPort1.Write(b, 0, count+4);
}

有几处错误,我都改了,你自己看看.上面的代码是修改后的.
qlu0634 2008-09-19
  • 打赏
  • 举报
回复
private void button3_Click(object sender, EventArgs e)
{
if (richTextBox2.Text == "")
{
MessageBox.Show("请检查输入!");
}
byte[] a = System.Text.Encoding.Default.GetBytes(richTextBox2.Text);
byte[] b = new byte[data.Length + 4];
a.CopyTo(b, 3);
int count = a.Length;
b[0] = 0;
b[1] = Convert.ToByte(count);
Byte fcs = b[1];
for (int i = 2; i <= count+2; i++)
{
fcs ^= Convert.ToByte(b[i]);
}
b[count + 3] = fcs;
b[count + 4] = 0xFF;
this.serialPort1.Write(b, 0, count+4);
}
程序写错了 应该是a.length+4,请教楼上的仁兄 看看现在这个程序有没有错误啊??谢谢啦

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧