已知设备商提供的通信协议为:
2协议内容
2.1读取版本号
此命令用于读取读写器的版本号,接收此命令的读写器进入标签设置。
Head Addr Len Cmd Check
0x0A 0x02 0x22 cc
读写器接收到此命令帧后,返回应答帧表示命令已接收。应答帧如下所示:
Head Addr Len Status Response Response Check
0x0B 0x04 0x00 Major Minor cc
Major为固件程序主版本。
Minor为固件程序次版本。我在窗体上放在serialPort1控件,并设置好属性。在按纽事件中加代码: serialPort1.Open();//打开串口 try
{
serialPort1.WriteLine("0x22");//发送读取设备版本号命令 }
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
} textBox1.Text = serialPort1.ReadLine().ToString();//接收返回设备应答信息但一到接收这里程序就死掉了。请问是什么原因?小弟第一次做这个,请高手们帮忙解决一下。即刻送分
2协议内容
2.1读取版本号
此命令用于读取读写器的版本号,接收此命令的读写器进入标签设置。
Head Addr Len Cmd Check
0x0A 0x02 0x22 cc
读写器接收到此命令帧后,返回应答帧表示命令已接收。应答帧如下所示:
Head Addr Len Status Response Response Check
0x0B 0x04 0x00 Major Minor cc
Major为固件程序主版本。
Minor为固件程序次版本。我在窗体上放在serialPort1控件,并设置好属性。在按纽事件中加代码: serialPort1.Open();//打开串口 try
{
serialPort1.WriteLine("0x22");//发送读取设备版本号命令 }
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
} textBox1.Text = serialPort1.ReadLine().ToString();//接收返回设备应答信息但一到接收这里程序就死掉了。请问是什么原因?小弟第一次做这个,请高手们帮忙解决一下。即刻送分
解决方案 »
- 数据插入缓存 memcache键值该怎么设计
- 请问DataGirdView能否直接操作数据库?
- 请教个简单的问题!!!
- c#怎样实现刷卡计时!!!!急啊
- 如何组织项目
- 关于.Attributes.Add("onclick", "selectchange(this,'hotmail','TextBox1')");
- 菜鸟发问:如何实现在两个窗体之间的相互切换?
- 自定义事件如何定义?
- 上海外资软件公司等你来,顶者有分
- 请问如何列出本机所有的共享目录?(不管权限如何设置的,只要共享的都要列)
- DEV GridContro
- 开发ActiveX的时候,里面放webbrowser,页面刷新时,activeX不显示了。
这里在没有收到数据时肯定会停在这里的,因为你使用的是同步的方式
如果你接收到串口信息, 不能直接赋值给textbox, 需要用到textBox.Invoke()
告诉你命令是:0x0A 0x02 0x22 。你偏偏就属容易0x22;
另外,在serialport_DataReceive事件里获取信息。
想在DataReceive里使用textbox1.text的话,主要要使用托管。
命令帧是主机操作读写器的数据帧,格式如下表所示:Head Addr Len Cmd Parameter … Parameter Check
0x0A 1 byte n+2 1 byte Byte 1 Byte n cc
Head是帧头标志,定义为0x0A
Addr是读写器地址,一般地址从0~240,255(0xFF)为公用地址,254(0xFE)为广播地址。读写器接收自身地址、公用地址和广播地址的命令,对广播地址命令不做回复。
Len是包长域,表示Length域后帧中字节数。
Cmd是命令码域。
Parameter是命令帧中的参数域。
Check是校验和域,规定校验范围是从帧头域到参数域最后一个字节为止所有字节的校验和(相加取反加1,取最后两位)。读写器接收到命令帧后需要计算校验和来检错。1.2.2 响应帧格式定义
响应帧是读写器返回给主机的数据帧,响应帧包含了读写器需要采集的数据,其格式定义如下表所示:Head Addr Len Status Response … Response Check
0x0A 1 byte n+2 1 byte Byte 1 Byte n cc
Head是包类型域,响应帧包类型固定为0xE0。
Addr是读写器自身地址。
Len是包长域,表示Length域后帧中字节数。
Status表示命令所规定的操作执行的结果,0表示正确执行,其他表示执行中发生异常。
Response是响应帧中的返回数据。
Check是校验和域,规定校验范围是从包类型域到参数域最后一个字节为止所有字节的校验和。PC机接收到命令帧后需要计算校验和来检错。
2协议内容
2.1读取版本号
此命令用于读取读写器的版本号,接收此命令的读写器进入标签设置。
Head Addr Len Cmd Check
0x0A 0x02 0x22 cc
读写器接收到此命令帧后,返回应答帧表示命令已接收。应答帧如下所示:
Head Addr Len Status Response Response Check
0x0B 0x04 0x00 Major Minor cc
Major为固件程序主版本。
Minor为固件程序次版本。
这就是协议,串口和设备都是正常的,因为我在用VB的程序能读取?现在要写成C#的
{
serialPort1.WriteLine("0x0A");
serialPort1.WriteLine("4");
serialPort1.WriteLine("0x02");
serialPort1.WriteLine("0x22");
serialPort1.WriteLine("cc");
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
}
是否是这样写?
看看有没有返回数据。
能不能帮忙远程一下,调试助手上发也没反映?我的QQ463845617。不知你有没有时间麻烦你帮我看看,谢谢!
你不是有VB的程序吗?你看一下VB程序发送的命令是怎么编辑的。
命令帧是主机操作读写器的数据帧,格式如下表所示:Head Addr Len Cmd Parameter … Parameter Check
0x0A 1 byte n+2 1 byte Byte 1 Byte n cc
Head是帧头标志,定义为0x0A
Addr是读写器地址,一般地址从0~240,255(0xFF)为公用地址,254(0xFE)为广播地址。读写器接收自身地址、公用地址和广播地址的命令,对广播地址命令不做回复。
Len是包长域,表示Length域后帧中字节数。
Cmd是命令码域。
Parameter是命令帧中的参数域。
Check是校验和域,规定校验范围是从帧头域到参数域最后一个字节为止所有字节的校验和(相加取反加1,取最后两位)。读写器接收到命令帧后需要计算校验和来检错。
请注意看协议,我现场编写,自己再改改吧。
byte[] bdata = new byte[5];
bdata[0] = 0x0A;
bdata[1] = 0x06;
bdata[2] = 0x02;
bdata[3] = 0x22;
bdata[4] = 0x未知;
//未知的部分就是:Check是校验和域,规定校验范围是从帧头域到参数域最后一个字节为止所有字节的校验和(相加取反加1,取最后两位)。读写器接收到命令帧后需要计算校验和来检错。
//这个校验和,是需要你写个算法,把从bdata[0]到bdata[3]这个四个字节里的数据做校验,并把校验结果赋值给bdata[4].具体的算法描述也告诉你了:规定校验范围是从帧头域到参数域最后一个字节为止所有字节的校验和(相加取反加1,取最后两位)。
try
{
serialPort1.WriteByte(bdata, 0, bdata.Length);
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
}
苍天,是我打错字了,还是你打错字了?
我打的是:
byte[] bdata = new byte[5];
bdata[0] = 0x0A;
bdata[1] = 0x06;
bdata[2] = 0x02;
bdata[3] = 0x22;
bdata[4] = 0x未知;
{
serialPort1.WriteByte(bdata, 0, bdata.Length);
}
catch (Exception ee)
{
MessageBox.Show(ee.ToString());
}serialPort1没有WriteByte这个属性