日期:2014-05-17  浏览次数:21394 次

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;