JK_alvin 发表于 2017-9-12 14:07

关于RS-485的驱动编写框架

【环境】硬件接口:ARM板通过串口连接TTL转485的模块,然后485模块上挂了好几个编码器;
【问题】如题,最近编写基于485的驱动(串口已经能实现数据的收发),现在如果要抽象接口给上层,想请教下实现的思路;
【抛砖引玉】:最简单的就是发一个问询命令,然后等待数据(等待的条件:超时或者数据尾),然后再问询下一个设备;
个人感觉这样写出来的话,比较笨一点,有没有高手指点以下呢~

feelhyq 发表于 2017-9-12 15:30

查表

JK_alvin 发表于 2017-9-12 16:20

feelhyq 发表于 2017-9-12 15:30
查表

能不能细讲下,谢谢~

feelhyq 发表于 2017-9-12 21:17

JK_alvin 发表于 2017-9-12 16:20
能不能细讲下,谢谢~

百度下 C语言查表法

一事无成就是我 发表于 2017-9-13 18:53

注册,轮询是RS485经典处理方法

JK_alvin 发表于 2017-9-18 09:05

一事无成就是我 发表于 2017-9-13 18:53
注册,轮询是RS485经典处理方法

谢谢~{:handshake:}

JK_alvin 发表于 2017-9-18 09:16

我还是把我的思路写下:
我后来是按照状态机的方式进行编写的,因为我485总线上外挂了2个设备,我的状态机分了3个部分:
1.设备轮训命令,(一个静态变量用作设备地址,每下发一次读取命令,设备地址增加);
2.读取缓存数据,解析设备返回值(因为我的协议里面有设备地址,所以不用单独考虑数据的来源);
3.case不同地址,针对性的数据处理;
说下这样做的缺点:
没有做超时检测,默认每个设备在master下发命令后,只有一个循环周期(10ms)的时间进行传输,如果发送丢帧、或接收丢帧,没有重发的机制;

一事无成就是我 发表于 2017-9-18 09:26

你太神了,居然不做容错处理,询问完毕,定时启动(可以用变量计数定时)。不但要做容错处理,而且有时候还要做协议序号处理(序号是用来表达下发的第几次命令)

JK_alvin 发表于 2017-9-18 09:42

一事无成就是我 发表于 2017-9-18 09:26
你太神了,居然不做容错处理,询问完毕,定时启动(可以用变量计数定时)。不但要做容错处理,而且有时候还 ...

是的,我这样处理确实很粗糙,后面必须要增加容错的机制;
另外一个就是,我外挂的这个设备读取的数据需要比较高的实时性,轮询每个设备如果设置超时的话会影响下一个设备的数据实时性。所以也没考率给每个设备几次响应时间。

一事无成就是我 发表于 2017-9-18 11:44

JK_alvin 发表于 2017-9-18 09:42
是的,我这样处理确实很粗糙,后面必须要增加容错的机制;
另外一个就是,我外挂的这个设备读取的数据需 ...

那你还不如用双串口的芯片两条485,没必要做的这么折腾人

JK_alvin 发表于 2017-9-18 16:15

一事无成就是我 发表于 2017-9-18 11:44
那你还不如用双串口的芯片两条485,没必要做的这么折腾人

哎~就是因为串口不够,用的STM32F429ZIT6,6路串口都已经用完了.

yangzj1974 发表于 2018-2-13 11:10

学习了,谢谢。
页: [1]
查看完整版本: 关于RS-485的驱动编写框架