RS485通信应用层开发心得

    RS485和RS232都是常用的串口通信,前端设备与控制中心除了通过网络通信进行交互以外,串口通信也成为了一种选择。RS485的可靠传输距离远,接线简单成为了相对于RS232的最大优势。

 

    首先,简单的看了一下485驱动层代码,采用的是轮询方式获取数据,具体实现没看。轮询应用特点是传输数据量一次不是很大,但是次数很频繁。而中断方式的应用特点是一次传输的数据量很大,但是次数不是很频繁。每次中断是要在进程管理上消耗时间的,比如保存中断地址,记录各种标志位寄存器,所以不适合频繁中断。

 

    485初始化工作是交给驱动层去完成的,应用层基本不需要做什么事,因为应用简单,甚至连相关的结构体都不需要构造的。这里用的波特率9600,八位数据位一位停止位。停止位在收发时应用层也可以忽略了,只需要关系数据内容和收发方式就行了。

 

     收发可以采用一次只收发单包数据(八位),也可以采用一次收发任意包的数据,其实在底层的实现上,总是一包一包数据,应用层收发多包数据时,数据会被临时保存在收发缓冲区,这也是由驱动层设置硬件去实现,应用层不用管。应用层真的爽死了。从稳定性来看,向我这样的菜鸟用了一次性收发完协议规定的所有数据,这样比较稳定,不太容易丢包,因为两个单包收发的间隔时间不好把握,如果单包单包的收发,丢包现象比较严重。当然这只是菜鸟的选择。

 

     遇到的第一个问题就是前端向PC发送数据丢包严重,每次发送都要发15个字节的数据,经常收14个或者12个,很郁闷,后来采用一次性发送多包基本解决。

      第二个问题很郁闷,无论使用什么SVN稳定版本的代码都无法收到PC发过来的数据,相当诧异,更改了485两个GPIO口的各种拉高拉低的排列组合都不行。这个问题困扰了我将近一天的时间。最后是改了其中一个口的方向,将输入改为输出,当时没想到这点,还是经验不足没有想到去尝试。

      最后一个问题就是干扰问题,也是相当恶心,因为是从前段连接到普通的PC上所以要用到485转232转接口,开始用的转接口一看就不太让人放心,果不其然,先是收数据时总是接收到ff fe fc这样的数据,但是驱动层得到数据来的时间是和发送端吻合的,开始怀疑是接口的问题,换了一台前段,接收正常。后来又是发现在前段读取数据时总是有随机长度的数据随机的从串口传到PC,这影响到PC端的接收,后来换了一个转接口,搞定。总是在连串口线这样的硬件时以后特别要主要信号干扰问题。感觉这是对于我等新手而言最摸不着头脑的问题。

 

     问题讲完,讲一下心得,因为硬件原因,前段485暂时还不能达到全双工通信,只能采取半双工,发时不收,收时不发。因此,在应用时需要经常更改GPIO管脚的电平,更改电平带来的副作用是前段会收到时间可预知的内容不可知的错误短数据包。为了解决这个小问题,在收数据select之前首先清除缓冲区已经到达前段还没有被read的数据这里用了tcflush来搞定。说到select这次应用对他有了比较深刻的体会,select主要就是让多路IO都能各自的收发而不因一个IO没有信号而轮询阻塞IO。所以在收数据时一般都要使用。除非只用一种与其他设备的通信否则在多种通信比如以太网通信串口通信的时候就需要使用select以避免相互影响。最后的心得是在十六进制的数据计算上,其实十六进制一般的加减计算完全等同于十进制。但是移位计算就需要主要不能等同与二进制。开始我就犯了这个错误0xf<<1就以为是0xf0了。其实,移位运算符的效用等同于乘除运算,就是乘除2的关系,对于二进制而言从表示来看就是补零或者截位。十六进制想得到前述的同样表示就要一次移动四位也就是乘除16。也就是说0xf<<4==0xf0。唉,自己实在是太菜了。连这个都要拿出来讲一下提醒自己。晕。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值