打印
[嵌入式Linux]

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

[复制链接]
1747|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JK_alvin|  楼主 | 2017-9-12 14:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
【环境】硬件接口:ARM板通过串口连接TTL转485的模块,然后485模块上挂了好几个编码器;
【问题】如题,最近编写基于485的驱动(串口已经能实现数据的收发),现在如果要抽象接口给上层,想请教下实现的思路;
【抛砖引玉】:最简单的就是发一个问询命令,然后等待数据(等待的条件:超时或者数据尾),然后再问询下一个设备;
个人感觉这样写出来的话,比较笨一点,有没有高手指点以下呢~

相关帖子

沙发
feelhyq| | 2017-9-12 15:30 | 只看该作者
查表

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
JK_alvin + 1
板凳
JK_alvin|  楼主 | 2017-9-12 16:20 | 只看该作者

能不能细讲下,谢谢~

使用特权

评论回复
地板
feelhyq| | 2017-9-12 21:17 | 只看该作者
JK_alvin 发表于 2017-9-12 16:20
能不能细讲下,谢谢~

百度下 C语言查表法

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
JK_alvin + 1
5
一事无成就是我| | 2017-9-13 18:53 | 只看该作者
注册,轮询是RS485经典处理方法

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
JK_alvin + 2
6
JK_alvin|  楼主 | 2017-9-18 09:05 | 只看该作者
一事无成就是我 发表于 2017-9-13 18:53
注册,轮询是RS485经典处理方法

谢谢~

使用特权

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

使用特权

评论回复
8
一事无成就是我| | 2017-9-18 09:26 | 只看该作者
你太神了,居然不做容错处理,询问完毕,定时启动(可以用变量计数定时)。不但要做容错处理,而且有时候还要做协议序号处理(序号是用来表达下发的第几次命令)

使用特权

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

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

使用特权

评论回复
10
一事无成就是我| | 2017-9-18 11:44 | 只看该作者
JK_alvin 发表于 2017-9-18 09:42
是的,我这样处理确实很粗糙,后面必须要增加容错的机制;
另外一个就是,我外挂的这个设备读取的数据需 ...

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

使用特权

评论回复
11
JK_alvin|  楼主 | 2017-9-18 16:15 | 只看该作者
一事无成就是我 发表于 2017-9-18 11:44
那你还不如用双串口的芯片两条485,没必要做的这么折腾人

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

使用特权

评论回复
12
yangzj1974| | 2018-2-13 11:10 | 只看该作者
学习了,谢谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:真正的设计应该是友好的,给人带来温暖和希望的。

8

主题

62

帖子

3

粉丝