RS485通讯求助
我遇到一问题,需要用到RS485通讯,硬件连接 电脑通过RS232转485接口 连接到下位机读取数据,通讯定义如下:
1.1 传输格式
信息传输为异步方式,并以字节为单位(LSB先),在主机和从机之间传递的通讯信息是11位的字格式。
有校验位(奇偶校验)的传输序列:1个起始位、8个数据位、1个校验位、1个停止位。
无校验位的传输序列:1个起始位、8个数据位、2个停止位。(出厂默认)
1.2 帧格式
一个新的通讯信息帧开始之前,通讯总线应存在不小于3.5字节的间歇时间,通讯开始之后,每两个字节之间应不大于1.5字节的间歇时间。
开 始 地址码 功能码 数据区 CRC校验码低字节 CRC校验码高字节 结 束
≥3.5字节间歇时间 1字节 1字节 n字节 1字节 1字节 ≥3.5字节间歇时间
3.1 功能码03H:读寄存器数据
例1:主机要读取从机地址为01H,起始寄存器地址为0FH的1个寄存器数据。 03H是读取数据的意思
主机发送:01 03 00 0F 00 01 B4 09
主机发送 发送的信息
地址码 01H
功能码 03H
起始寄存器地址 高字节 00H
低字节 0FH
寄存器数量 高字节 00H
低字节 01H
CRC校验码 低字节 B4H
高字节 09H
如果从机0FH寄存器的数据为1388H,从机返回:01 03 02 13 88 B5 12
从机返回 返回的信息
地址码 01H
功能码 03H
返回数据的字节数 02H
0FH寄存器数据 高字节 13H
低字节 88H
CRC校验码 低字节 B5H
高字节 12H
现在要问下
1:一个新的通讯信息帧开始之前,通讯总线应存在不小于3.5字节的间歇时间,通讯开始之后,每两个字节之间应不大于1.5字节的间歇时间。
这个1.5字节是多长时间
2:主机发送:01 03 00 0F 00 01 B4 09
这个具体通讯代码要怎么写?是发送8次两十六进制数据还是别的,麻烦给个具体代码,谢谢!
只有62分了,全部压上,想用无校验位的方式。
------解决方案--------------------第 一个不懂,
第二个
2:主机发送:01 03 00 0F 00 01 B4 09
这个具体通讯代码要怎么写?是发送8次两十六进制数据还是别的,麻烦给个具体代码,谢谢!
直接
用byte[] buffer=new byte[你要发送的长度]
buffer[0]=0x01;
buffer[1]=0x03;
buffer[2]=0x00;
...
buffer[6]=0xB4;
最后一位较验位是这么算的
for(int i=0;i<buffer.Length-1;i++)
{
buffer[7] ^=buffer[i];
}
然后直接调用SericePort的Send(buffer);
------解决方案--------------------
public byte[] CRC16(byte[] data)
{
byte CRC16Lo;
byte CRC16Hi; //CRC寄存器
byte CL; byte CH; //多项式码&HA001
byte SaveHi; byte SaveLo;
byte[] tmpData;
int Flag;
CRC16Lo = 0xFF;
CRC16Hi = 0xFF;
CL = 0x01;
CH = 0xA0;
tmpData = data;
for (int i = 0; i < tmpData.Length; i++)
{
CRC16Lo = (byte)(CRC16Lo ^ tmpData[i]); //每一个数据与CRC寄存器进行异或
for (Flag = 0; Flag <= 7;