关于RS485总线通信调试和编程代码需要注意的问题

合集下载

RS485通讯应该注意的几点

RS485通讯应该注意的几点

RS485通讯应该注意的几点一、如何布线走线走得好,可以很大程度减少干扰的影响,提高通讯的可靠性,但我们在实践中往往对此认识不足。

如为了走线方便,把网线放在电源线的线槽里,或在天花板走线时经过日光灯等干扰源,这样走线是不对的。

实际上干扰源对相邻网线的干扰,主要是通过磁场和电场的作用,按照电磁理论,干扰源对网线的感应与距离的平方成反比,因此,网线离干扰源那怕远离10厘米,网线受到的干扰都会明显减弱。

综上所述,走线应遵循两个原则:①远离电源线,日光灯等干扰源;②当网线不能与电源线等干扰源避开时网线应与电源线垂直,不能平行,并采用质量高的双绞线走线。

二、120欧姆终端电阻问题在仪表系统的末端和485转换卡的尾部,应该加入120欧姆的终端电阻,目的是防止高频反射,使通讯信号发生畸变。

三、通讯速率选取的原则我们选择的原则是:距离短可以选择较高的波特率,距离长则选择较低的波特率。

当我们选择较低的波特率时,如果发现比正常速度(同样波特率相比较)慢得多,很可能线路已受到干扰,数据校验经常出错,不断重传,造成通讯速度娈慢,此时应检查网络是否采取本文所提到的抗干扰措施,同时还可以采取提高通讯波特率的方法,以快速通过线路的方式,减少干扰的影响。

四、线型的选择RS485是采用平衡式(差分式)线路,对同时出现在两条信号线DATA+和DATA-的干扰有较强的抑制能力,当两条线绞在一起时,对通讯各种分布参数耦合过来的干扰信号则可平均地分配到这两条线上,因此对RS485的平衡式线路而言,用双绞线可获得抗干扰能力。

因此,建议采用无屏蔽的双绞线,如果有条件可采用屏蔽双绞线,但屏蔽线两端要接好地,才有屏蔽效果。

如果距离较长时,线路的电阻不容忽视,电阻的存在会使信号衰减,降低网络通讯的可靠性。

因此距离较长,应选用铜芯较粗的绞线,理论上讲一根线两端电阻不应超过80Ω。

五、注意接地目前,有相当部分PC机在使用时,电源并没接地。

主要是电源没有接地,或电源插座没有地线,从而造成PC机地线与地之间往往有几十伏以上的漏电电压存在,这个电压很容易就引入网卡或收款机中,从而导致网卡或收款机通讯损坏。

RS485通讯注意事项

RS485通讯注意事项

RS485通讯注意事项
1: 485总线增加终端电阻
1:设备少于22台,并且距离超过300米时需要添加终端电阻
2:设备超过22台,不需要添加终端电阻,增加终端电阻会降低485总线负载能力
2: 485干扰(共模干扰和差模干扰)
485通讯线由两根双胶线组成,它通过两根通讯线之间的电压差的方式来传递信号,称为差分电压传输,差模干扰在两根信号线之间传输,属于对称性干扰,消除差模干扰的方法是在电路中增加一个偏值电阻,并采用双胶线;共模干扰是在信号线与地之间传输,属于非对称性干扰,消除干扰的方法包括:1>采用屏蔽双绞线并有效接地2>强电场的地方还要考虑采用镀锌管屏蔽3>布线原理高压线
3:485通讯线选择标准。

rs485接口设计要点和调试方法

rs485接口设计要点和调试方法

rs485接口设计要点和调试方法一、RS485接口设计要点:1.基本电气参数:RS485接口是一种基于差分传输的串行通信接口,能够实现远距离和高速传输。

在设计RS485接口时,需要考虑以下基本电气参数:a.差分电平:RS485采用差分信号传输,所以需要在接口电路中设置一个电平变换器,将逻辑电平转换为差分电平。

通常差分电平为正负两个电平,例如:+5V和-5V。

b.带宽:RS485接口的带宽决定了其传输速率和信号质量。

在设计时需要根据实际需求选择合适的带宽。

c.驱动能力:RS485接口通常需要驱动一定数量的设备,因此需要考虑驱动电流和输出功率等参数,以确保信号传输稳定和可靠。

2.线路特性:a.线路长度:RS485接口支持较长的通信距离,但实际可靠距离受到多种因素的影响,如传输速率、电缆类型和环境干扰等。

因此,在设计RS485接口时需要考虑通信距离的限制,并根据需求选择合适的电缆类型和衰减补偿方法。

b.终端电阻:RS485通信线路需要在两端分别加上120欧姆的终端电阻,以确保信号有效的传输和防止信号反射。

c.屏蔽和抗干扰措施:RS485接口在电气环境中可能会受到较强的干扰,如电磁辐射和电磁感应等。

为了提高信号质量和抗干扰能力,可以采用屏蔽电缆、引入滤波电路和设置适当的接地措施。

3.通信协议:a.数据格式:RS485接口支持多种数据格式,包括:ASCII码、二进制码和Modbus等。

在设计接口时需要根据实际应用场景选择合适的数据格式。

b.通信速率:RS485接口支持多种通信速率,通常为几百kbps至几Mbps。

在设计接口时,需要根据实际需求选择合适的通信速率,并确保接口电路的传输带宽足够以支持所选择的速率。

c.错误检测和纠正:RS485接口在数据传输过程中可能会出现错误,例如位错误、校验错误和帧错误等。

为了提高通信的可靠性,可以采用差错检测和纠正机制,如CRC校验等。

二、RS485接口调试方法:1.硬件调试:a.接线检查:首先需要检查接线是否正确连接,包括数据传输线、终端电阻和供电电路等。

RS485总线常见技术问题解答!网友看完:涨知识了,不用再瞎搞了

RS485总线常见技术问题解答!网友看完:涨知识了,不用再瞎搞了

RS485总线常见技术问题解答!网友看完:涨知识了,不用再瞎搞了RS485总线通过拉动一对总线来扩展检测设备,然后将模块连接到总线,并将检测设备连接到模块。

一般情况下,模块与探测设备放在一起,这样线材耗费少、施工费用低、扩展方便。

在RS485总线布线或者使用中经常会遇到一些问题,我们该如何解决呢?下面给大家详细讲解一下RS485总线常见技术问题解答,希望对您有所帮助。

一、RS485总线距离能达到多远?当线材满足要求时,一条RS485总线最多可达1200米。

如果距离超过1200米,每个额外的加一个RS485总线中继器可以再延长1200米。

二、RS485总线的线材有什么要求?一般来说,推荐使用1.0 mm 2以上的屏蔽双绞线,但是当RS485总线距离较短时,可以适当降低线材要求,如下所示:1、RS485总线距离小于200米:可以使用0.5 mm 2以上的普通线材。

2、RS485总线距离超过200米但小于500米:使用0.75 mm 2以上的普通双绞线。

3、RS485总线距离超过500米但小于1200米:使用1.0 mm 2以上的屏蔽双绞线。

三、RS485总线的施工有什么要求?1、尽量用一条干线将每台RS485总线设备串联起来,如果有支路,RS485总线设备到干线支路尽可能短,最好不超过5米。

2、如果干线不是一条,而是有几条大支路,那么几条大支路的总线长度不应超过800米。

如果超过这个距离,通过在分支增加总线中继器,每增加加一个个中继器,可以增加两个分支。

3、RS485总线应远离高压设备,如220伏交流线路、荧光灯、高压变压器等。

例如,如果你使用220伏交流电,两者之间的最小距离应该超过20厘米。

4、在野外,很少有建筑物,电子设备容易受到雷击。

此时,最好将信号线和电源线放在金属管中,埋在20厘米以下的土壤中。

每根金属管都焊接在一起,金属管的两端都应连接到地线。

四、很多设备串联起来,距离远,电源电压下降严重,设备的末端部分几乎不能工作,如何解决?1、如果电压降不大,可以通过增加2-5伏来工作。

RS485布线应该注意的问题

RS485布线应该注意的问题

485布线应该注意的问题第一、澄清几个概念:概念一: 485总线的通讯距离可以达到1200米.其实只是485总线结构理论上 在理想环境的前提下才有可能使得传输距离达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常,所以通常485总线实际的稳定的通讯距离远远达不到1200米,负载485设备多,线材阻抗不合乎标准,线径过细,转换器品质不良,设备防雷保护,波特率的加高等等因素都会降低通讯距离.概念二: 485总线可以带128台设备进行通讯.其实并不是所有485转换器都能够带128台设备的,要根据485转换器内芯片采用的型号和485设备芯片采用的型号来判断的,谁低就谁的,一般485芯片负载能力有三个级别 32台 128台 256台,理论上的标称往往实际上是达不到的,通讯距离越长,波特率越高,线径越细,线材质量越差,转换器品质越差,转换器电能供应不足(无源转换器),防雷保护越强这些都会大大降低真实负载数量.概念三: 485总线是一种最简单 最稳定 最成熟的工业总线结构.这种概念是错误的应该是: 485总线是一种用于设备联网的经济型的传统的工业总线方式,通讯质量是需要根据施工经验进行测试和调试的,485总线虽然简单,但必须严格安装施工规范进行布线.第二、严格几个施工规范:485+和485-数据线一定要互为双绞.布线一定要布多股屏蔽双绞线,多股是为了备用,屏蔽是为了出现特殊情况时调试,双绞是因为485通讯采用差模通讯原理,双绞的抗干扰性最好.不采用双绞线,是极端错误的.485总线一定要是手牵手式的总线结构,坚决杜绝星型连接和分叉连接.设备供电的交流电及机箱一定要真实接地,而且接地良好.有很多地方表面上有三角插座,其实根本没有接地,要小心接地良好时,可以确保设备被雷击 浪涌冲击静电累计时可以配合设备的防雷设计较好地释放能量,保护485总线设备和相关芯片不受伤害,避免和强电走在一起,以免强电对其干扰.第三、几种常见的通讯故障:通讯不上,无反应.可以上传数据,但不可以下载数据.通讯时,系统提示受到干扰.或者不通讯时,通讯指示灯也不停地闪烁.有时能通讯上,有时通讯不上.有的指令可以通,有的指令不可以通.第四、推荐几个调试方法:首先要确保设备接线正确,且严格合乎规范.共地法: 用1条线或者屏蔽线将所有485设备的GND地连接起来,这样可以避免所有设备之间存在影响通讯的电势差.终端电阻法: 在最后一台485设备的485+和485-上并接 120欧姆的终端电阻来改善通讯质量.中间分段断开法: 通过从中间断开来检查是否是 设备负载过多 通讯距离过长 某台设备损害对整个通讯线路的影响等原因.单独拉线法: 单独简易暂时拉一条线到设备,这样可以用来排除是否是布线引起了通讯故障.更换转换器法: 随身携带几个转换器,这样可以排除是否是转换器质量问题影响了通讯质量.笔记本调试法: 先保证自己随身携带的电脑笔记本是通讯正常的设备,替换客户电脑,来进行通讯,如果可以,则表明客户的电脑的串口有可能被损害或者受伤.第五、提出几个建议和忠告:建议用户使用和购买门禁厂家提供的485转换器或者厂家指定推荐品牌的485转换器.门禁厂家会对与其配套的485转换器做大量的测试工作,并且会单独要求485厂家安装其固定的性能参数进行生产和品质检测,所以和其门禁设备具备较好的兼容性.千万不要贪图便宜购买杂牌厂家的485转换器.严格按照485总线的施工规范进行施工,杜绝任何侥幸心理.对线路较长 负载较多的情况采用主动科学的有预留的解决方案.如果通讯距离过长,建议如果超过500米就采用中继器或者485HUB来解决问题.如果负载数过多,建议如果一条总线上超过30台就采用485HUB来解决问题.现场调试带齐调试设备.现场调试一定要随身携带几个确保以前可以接长距离和多负载的转换器 一台常用的电脑笔记本 测试通路断路的万用表 几个120欧姆的终端电阻.485总线布线规范及调试485总线由于其布线简单,稳定可靠从而广泛的应用于视频监控,门禁对讲,楼宇报警等各个领域中,但是,在485总线布线过程中由于有很多不完全准确的概念导致出现很多问题。

485 通讯调试笔记

485 通讯调试笔记

3.发现发送时,每次最后一个字节,不能完成发送。
分析最后一个字节在单片机串行位发送过程中,发送使能已经完了成关闭,最后一个字节发送完成以后,延迟若干ms,关闭发送使能,问题解决。
4. A,B输出端串接电阻,焊接上以后,不能发送。
仔细检查发现,A,B输出端串接电阻焊接成了200欧姆,实际为20欧姆。
调试一个485通讯板:
1.发现不能通讯,先去除光耦,用单电源直接控制,能通讯,最终发现布板时用的protel标准库的光耦元件,3,4脚,和实际tlp521-1相反,导致不能能上9600波特率,减小光耦上拉电阻为3.3K,可以9600波特率。分析,器件的速度取决于对内部杂散电容充电速度,减小上拉电阻,缩小了杂散电容充电时间,提高了通讯速度。
5.主机有的时候,发送数据以后,立即接收到一个0xff字节,此时从机尚未发送数据,分析认为,这个数据属于反射干扰形成的,仔细检查,发现120欧美中断匹配电阻未焊接。

如何避免RS485通讯布线中的常见问题

如何避免RS485通讯布线中的常见问题

如何避免RS485通讯布线中的常见问题2023年了,现在通信技术越来越发达,以RS485作为一种常见的通信协议在各个领域得到了广泛应用。

RS485通信协议的优点是它是可靠的、稳定的、高速的、远距离传输的通信技术。

但是,由于使用者在布线实践过程中可能还存在一些误解,导致出现一些常见的问题,它们会严重影响RS485通信的稳定性和可靠性。

那么,本文主要是探讨如何避免在RS485通讯布线中的常见问题。

一、对RS485线路布线的要求为了保证RS485协议的通信稳定性和可靠性,我们需要确保布线的正确性。

这需要注意以下几个方面。

1.布线距离的限制RS485总线是一个多点通信总线,通常只能够在约1200米的范围内运行。

如果在这个范围内,它会受到通信距离的限制,难以达到更远距离的传输。

2.电源供电的保证RS485线路的工作电压一般在5V-12V之间,如果在通讯时没有提供稳定的电源供应,就会出现通讯各方面的异常状况,如通讯速度变慢、信号传输受损等。

3.正确的接线方式RS485的线路网络主要分为四种接线方式:点对点,双向总线,单向半双工总线和全双工总线。

正确的接线方式可以提高通信的效率和稳定性。

4.屏蔽处理在RS485的信号传输中,由于存在大量的干扰,需要对总线进行屏蔽处理,以保证传输信号的完整性。

这可以通过屏蔽线、屏蔽夹等方式进行操作。

二、避免RS485通信布线中的常见问题1.距离太远RS485通信总线一般只能在1200米的范围内传输数据。

如果RS485总线距离超过了允许的范围,那么数据传输的过程中就会出现通信的问题,例如误码率过高,通信速度变得缓慢等现象。

因此,在实际应用中需要对RS485总线的距离进行限制,以保证通信的稳定性和可靠性。

2.数据线的接触不良数据线的接触不良是RS485线路布线中最普遍的问题之一。

这是因为,在安装过程中,数据线可能被挤压或者拉伤,导致它们之间的接触不良,从而导致通信失效。

为了避免这种问题,我们需要在安装过程中谨慎处理,保护好数据线,避免受到外界影响。

RS485通讯原理及排错处理

RS485通讯原理及排错处理

RS485通讯原理及排错处理一、RS485通信原理RS485通信总线使用差分信号传输方式,即通过正负两根数据线进行数据传输。

正线上的电压高于负线上的电压表示1,反之表示0。

这种差分信号的方式可以提高抗干扰能力,减小信号失真率。

RS485总线的数据传输速率可根据具体应用需求选择,通常可以达到几十kbps至几Mbps的速率。

在RS485通信中,主设备通过向从设备发送控制命令或数据,从设备则根据命令执行相应的操作,并将执行结果返回给主设备。

RS485通信总线支持多个从设备同时响应主设备,实现了多点通信。

二、RS485通信排错处理方法1.差分信号线路电气连接方面的排错处理方法:-检查线路是否有不正常的短路或断路。

可以使用万用表或示波器进行检测。

-确保各个节点的信号引线正确连接到差分信号线路上。

检查是否有接错或误连的情况。

-检查总线两端是否加上了终端电阻,终端电阻的作用是抑制信号反射,提高通信质量。

2.通信参数配置方面的排错处理方法:-通信速率选择合适的波特率,通常可以根据具体应用需求进行设置。

-检查通信模式是否匹配,主设备和从设备之间的通信模式要保持一致,如全双工或半双工模式。

-检查数据位、停止位和校验位的配置是否一致,这些参数需要在主设备和从设备之间保持一致,否则会导致通信错误。

3.通信协议方面的排错处理方法:-检查通信命令或数据是否按照协议规定的格式进行发送。

如果命令或数据格式错误,从设备可能无法正确解析。

-确保通信命令或数据的有效性,即所发送的控制命令或数据是否正确并且得到从设备的正确响应。

4.环境干扰方面的排错处理方法:-检查总线系统中是否有强电机、电磁干扰源等影响信号传输的设备存在。

需要尽量将RS485总线与其他干扰源隔离开。

-如果环境干扰严重,可以考虑在差分信号线路上添加屏蔽层,以减小外部干扰对通信信号的影响。

5.软件程序方面的排错处理方法:-检查主设备和从设备的软件程序是否按照通信协议进行编写,确保通信命令的正确性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关于RS485总线通信调试和编程时需要注意的问题以下经验是自己在开发广电1KW多类型激励器数字发射机项目时的一些经验之谈,尤其对于新同事可能在今后工作中遇到类似问题时,也许在读完本文之后或许有可能会让他们少走点弯路吧,于是乎,在此记录下来。

关于RS485总线之于RS232的通讯距离更远、实现一对多通讯等等的多种优势就跳过直接不谈了,主要讲述一下实际工作中的遇到的问题、解决方法。

在本次工作前期,更换激励器,无非首要任务是要让新激励器与CCU通讯上,原设备采用的是串口复用方式在同一个RS485串口上与主备切换板等多个模块进行通信,在与系统组态的时候如果发现部分设备通信不上,我们就应该注意以下问题。

(一)、硬件层面:(1)、确保线路不短路,不断路。

其实这应该不是问题,但却是我们部分(尤其是软件工程师)容易忽视的问题,往往认为线路没有人动应该肯定是没有问题的,结果在软件上找了半天,最后发现原来却是最基本的断路问题就尴尬了。

之所以提出来是因为以前好像也有类似情况发生过,再者,大家不要笑话我,我在这也卡了一个下午,因为当时供应商只提供了一台新激励器,测试部和研发部以及其它部门都要用它,过于频繁的插拔线导致后面RS485与主备切换板的通讯线看似完好,实则里边断路了。

(2)、确保RS232转RS485时转出来时的接口线序问题。

很多时候惯性思路的以为,一般转出来的不就是RS232或者RS485的标准接口嘛,这不可能是问题,而一旦出现问题就很难发现,就比如这次德兴激励器,由于供应商德兴的激励器的硬件版本变化很快,他们做出来的RS232接口和配套的RS232转RS485的接头的数据收发TX和RX居然是与标准头是数据收发接头是反的。

当时也正是自己的“以为”也给我的通讯调试造成了一点滴小困扰。

(二)、系统层面:(1)、波特率配置这个应该一般人通讯不上,都会想到的,只是在这里再提一下。

(2)、通讯协议通讯协议就相当于语言规范,二个模块和设备通讯上不时,我们在确保硬件线没有问题后再确保是否所发命令是否按相关通讯协议在通信的。

(3)、地址位二个模块要通讯上,当然首先要能识别对方,一般采用地址位识别,如果通讯不上,我们首要检查的这个,事实上很多设备的地址位是可设的,就比如激励器,主备机的地址位不同且可调。

感觉有点像也是属于通讯协议的范畴。

以上是通讯调试时应该注意的问题。

接下来要说的是一些关于RS485软件编程要注意的问题。

(三)、软件编程:(1)通信交互方式RS485基本上采用一问一答的交互方式,主设备向从设备(这里是激励器)发送一条指令,从设备执行指令之后,返回一条应答命令。

为了减少数据流,德兴激励器的处理方法是在设置时并没有回复一个设置确认包来确认是否设置成功,而事实上我们是在不断查询激励器的数据回复包的,通过查询判断设置前后数据包的差异性来是完成可以判断是否设置成功的,这样很好的减少了没有必要的数据流在总线上的交互。

(2)数据接收处理方法(a)方法1:对于数据接收,最直观的想法是每接收到第1个字符之后,就立刻判断是否与本机地址匹配,否则停止接收数据,等待一段时间之后再接收。

(停止接收数据的目的在于丢掉该帧后续的数据。

)暂且把这个方法叫做方法1,事实上,对于这种方法,停止接收的时间段一般是固定的且预留得比较宽,有可能在停止接收的这个时间段内收到属于本机的数据帧,却没收到。

如过总线上数据量大的话,可能会一直存在这种问题,一直通信不上。

所以数据接收处理方法不合理也是会通讯不上的哦。

(b)方法2:和方法1不一样的是,在收到第1个字符之后,不立即处理,直到接收完整的长度(德兴激励器数据回包是LEN=65字节)后,再根据长度描述符定义的长度,接收完一帧之后再处理。

处理包括地址判断、CRC校验、以及协议解析等。

此方法2的特点:能很快的接收到完整的数据包,但是不是本地的数据包也接收进来了,对低端的CPU来说是个压力。

不过还好,我们公司的公司好歹是ARM9,应该问题不大。

(c)方法3:目前采用的是方法3,它也许不应该叫方法3的,因为只是在方法2的基础上增加了超时处理机制,收到1个字符之后,如果超过多长时间没有接收到下一个字符,则认为是数据包结束,对数据进行处理。

显然这样处理以后,虽然对CPU也许会有一定的压力(由于我们用的不是低端CPU,这里只是充分利用,不予以考虑),但是接收效果肯定是最好,且响应迅速。

(3)消息队列接收、发送阻塞与非阻塞的注意事项阻塞和非阻塞书上说的很专业,看起来有时也许都会晕,其实用我自己理解的意思就是:阻塞就是干不完不准回来;非阻塞就是你先干,我先看看有其他事没有,完了告诉我一声。

之所以提出这点,是因为当时调试的时候一度CPU占用率过高,有怀疑过是这里的原因。

消息队列可以说是Linux五大进程通信方法中比较经典的方法之一了,当然每种进程通信方式实现方式和功能不一样,带来适用的场景也有所不同。

关于消息队列,信号(Sinal)、管道(pipe)、信号量(Semaphore)等具体概念和使用方法不是本文重点,跳过不提,请自行百度。

消息队列主要用到的函数有以下三个(具体的使用方法请参考man手册,只做简易介绍):Int msgget(key_t key, int msgflag):获取或者打开一个消息队列;int msgsnd (int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg):发送一个消息到消息队列;参数msgflag:它可以设置为0;或者使用IPC_NOWAIT,如果消息队列已经满了,那么下次消息就不会写到消息队列中,控制将返回到对应进程中。

如果没有指明,调用进程会被挂起,直到消息可以写到消息队列中。

int msgrcv (int msqid, struct msgbuf *msgp, size_t msgsz,long msgtyp, int msgflg):从消息队列接收一个消息到msgbuf*;参数msgflg可以设置为0,代表该进程将一直阻塞,直到有消息可读停止。

但我们可以把该值设为IPC_NOWAIT 表示,如果没有消息可读时,则立刻返回-1,进程被挂起。

这里仅以查询命令发送和接收为例:/************************************************************* 函数名称:Dexing_snd_Exc_ReferCmdMsg** 功能描述:发送激励器查询命令到查询命令消息队列** 输入:*pcmd:消息缓冲区指针msgid:消息队列识别号** 输出:0 OR -1;** 全局变量:无** 调用模块:无** 日期:2014/11/05** 作者:zimo************************************************************/s32 Dexing_snd_Exc_ReferCmdMsg(s32 msgid, DEXING_EXCITER_REFER *pcmd) {s32 msglen = sizeof(DEXING_EXCITER_REFER)-sizeof(long);s32 ret;ret = msgsnd(msgid,(void *)pcmd, msglen ,BLOCK) ;if(-1 == ret){CCU_ERR("Send command message to RS485 bus failed.\n");perror("Dexing_snd_Exc_ReferCmdMsg:");printf("Send Refer command message to RS485 bus failed.\n");return -1;}return 0;}这里msgsnd采用BLOCK阻塞方式,事实上,有一点要注意的是msgsnd不管它是不是阻塞,它发送成功只表示数据写入缓冲区,不能代表数据被对面成功接受。

/************************************************************* 函数名称:Dexing_rcv_Exc_ReferCmdMsg** 功能描述:从查询命令消息队列中接收查询命令消息** 输入:*pcmd:消息缓冲区指针msgid:消息队列识别号** 输出:0 OR -1;** 全局变量:无** 调用模块:无** 日期:2014/11/05** 作者:zimo************************************************************/s32 Dexing_rcv_Exc_ReferCmdMsg(s32 msgid, DEXING_EXCITER_REFER *pcmd) {s32 timeout;s32 ret = -1;s32 msglen = sizeof(DEXING_EXCITER_REFER)-sizeof(long);timeout = RECV_RETRY_TIMES;usleep(20000);while(timeout --){Ret = msgrcv(msgid,(void *)pcmd, msglen ,FIFO, IPC_NOWAIT);CCU_ERR("msgrcv ret is %d\n", ret);if(-1 == ret)usleep(20000);elsereturn ret;}return ret;}这里采用IPC_NOWAIT的非阻塞方式,但又做了超时处理,很好的改善了系统资源占用过高的问题。

(4)其它软件编程注意事项以下为我们在软件编程时也应该注意的问题,只简略提下。

(a)、清零。

发送指令之前,一定记得先清空接收缓冲区,预防累加有其他无效的数据。

(b)、数据缓冲区要足够大。

这也是我在这次项目中遇到的一个BUG,由于自己的一时疏忽,新激励器的数据回包较原激励器的数据回包长度更长导致缓冲区不够造成BUG。

(c)采取非阻塞式发送大块的数据客户端接收数据不完整问题。

这个问题本应该不归在这的,因为讲的是socket服务器端和客户端的数据接收问题,只是又突然想起来以前做的一个项目,在此思维强化。

以上原因处理办法:数据还没发送完就拆线。

通信建立与拆线优先级别高于数据传输!设计通信系统时一定要注意,必须让接收端来拆线,确报数据接收完整。

发送端必须加时间判断,在一定的时间(如1分钟)对方未拆线在自己拆。

以上更多像是自己一个多月工作中遇到的问题总结,都是想到哪写到哪,以防自己以后再犯类似的错以及一些知识的在脑海中的强化,高手就可以直接跳过不看了啊。

相关文档
最新文档