这个主要靠编程实现,用不到很多寄存器,甚至可以说不牵涉别的寄存器,还是靠串口收发数据的那个寄存器。
举例来说吧,比如一个系统由一个上位机和2个下位机(分别是1#,2#)组成,上位机和下位机就是我们常说的主机和从机,
主机要给1#发一条指令,那么按照上面我们说的通信协议:起始码 地址码 指令码 数据码 校验和 结束码
假设上位机给1#机发送1234这几个数据,
起始码设为5A,
地址码为01,
指令码为00,
数据就是01,02,03,04,占4个字节,
校验码就采用地址码+指令码+数据,然后将这些加起来求和(注意,按字节相加,结果只取最低8位,也即校验和只占一个字节),那么校验码计算如下:01(地址码)+00(指令码)+01+02+03+04=0b,
结束码设为A5,
那么主机要发送的数据就是5A,01,00,01,02,03,04,0b,A5,将这些数据放在一个数组里面,比如A【9】。然后通过串口,将这个数组的数据发送出去。
1#从机收到串口中断信号后,开始接收数据,判断收到的第一个字节是不是5A,如果是,继续接受第二个字节,判断是不是01,是01,那就是上位机给自己发的信号(2#机受到01后,判断不是给自己的数据,就不再接受后面的数据);那么就会继续接受后面的数据,接收第三个字节为指令码00(假设这条指令是要1#机给上位机回发数据的指令,那么,接收完这些数据后,1#机还要给上位机回发数据)。然后接收后面的数据字节,接下来的连续4个字节都是数据,从机在接收这些数据的同时,还要把地址码,指令码,数据进行相加,得到一个值,然后把这个值与从串口收到的第8个字节比较,如果相等,则说明数据传输过程没有错误,可以正常处理这些数据,否则要抛弃这些数据。最后接受第9个字节,看看是不是A5,如果是,这次数据接收过程完全正确,否则出错,抛弃这些数据。
从机接收数据的时候,可以把所有收到的数据放到一个数组里(比如B【9】),确认所有收到的数据正确后,可以从这个数组里分检出有用的信息,分别处理,
如果需要向上位机回送信息,按照上述方法发送信息即可。
呵呵,啰里啰嗦说了这么多,如果说得不好,还请见谅 |