485通讯协议怎么写(锂电池485通讯协议)

      最后更新:2023-09-13 10:42

      485通信协议怎么规定

      把通讯做成命令,应答的帧形式,最好是帧长度固定。 举个例子,主机发送给从机的数据帧头 命令 参数1 参数2 参数3 参数4 校验和 帧尾从机回复的数据回复帧头 应答命令 结果1 结果2 结果3 结果4 校验和 回复帧尾在从机接收到帧头和命令后,并不进行处理,而是暂存起来,知道接收到帧尾,并接校验通过后,才真正执行。假如从收到帧头起,一定的时间内,还没有收到完整的帧,或者帧校验失败,那么从机用特殊的格式回复。当然,超时时间也可以不从帧头算,从上一个字节算也可以。这样的帧结构就能保证通讯的正确性,一般来讲,帧越长,通讯效率越高,但是占用暂存空间越打,而且出错的可能越大,出错后付出的代价也越大,实时性也越差,而且帧长度超过一定值后,通讯效率也不会再明显增加。帧越短,通讯效率越低,但是灵活。像上面的例子,帧长度是8,通讯效率是62.5%。如果将帧长度改为16,通讯效率变为81.25%下面是源代码:直接拷贝就能够编译通过了。当然要把寄存器改了。只有几行需要改的哈:#include "tot.h"#define GOOD_PARSE 0#define BADID_PARSE1#define BADLEN_PARSE 2short parsed;char *pbuf;void tsip_input_proc(TSIPPKT *rpt,unsigned char inbyte);void rpt_packet(TSIPPKT *rpt,int *obuf);void tsip_input_proc(TSIPPKT *rpt,unsigned char inbyte){switch(rpt->status){case TSIP_PARSED_DLE_1:switch(inbyte){case 0:case ETX: // illegaldatarpt->len=0;rpt->status=TSIP_PARSED_EMPTY;break;case DLE: // try normal message start againrpt->len=0;rpt->status=TSIP_PARSED_DLE_1;break;default: // legal ID ;start messagerpt->len=0;rpt->status=TSIP_PARSED_DATA;rpt->codes=inbyte;break;}break;case TSIP_PARSED_DATA:switch(inbyte){case DLE: // expect DLE or ETX nextrpt->status=TSIP_PARSED_DLE_2;break;default: // normal data byterpt->buf[rpt->len]=inbyte;rpt->len++;break;}break;case TSIP_PARSED_DLE_2:switch(inbyte){case DLE: // normal data byterpt->buf[rpt->len]=inbyte;rpt->len++;rpt->status=TSIP_PARSED_DATA;break;case ETX: // end of message,return TURE hererpt->status=TSIP_PARSED_FULL;break;default: // error:treat as TSIP_PARSED_DLE_1,start new report packetrpt->codes=inbyte;rpt->len=0;rpt->status=TSIP_PARSED_DATA;break;}break;caseTSIP_PARSED_FULL:caseTSIP_PARSED_EMPTY:default:switch(inbyte){case DLE: // normal message startrpt->len=0;rpt->status=TSIP_PARSED_DLE_1;break;default: // error:ignore inbyterpt->len=0;rpt->status=TSIP_PARSED_EMPTY;break;}break;}if(rpt->len>MAX_RPTBUF) // error:start new report packet{rpt->status=TSIP_PARSED_EMPTY;rpt->len=0;}}//串口字符交换*******************************************************************/int bGetShort(char *bp){int outval;char *optr;optr=(char *)&outval*optr=*bp<<8 & 0xFF00;*optr=*(++bp) | *optr;return outval;}//串口报文int rpt_0x14(TSIPPKT *rpt,int output[1]){char *buf;buf=rpt->buf;if(rpt->len!=2)return 0;output[0]=bGetShort(&buf[0]);return 1;}void rpt_packet(TSIPPKT *rpt,int *obuf){parsed=GOOD_PARSE;switch(rpt->codes){case 20:rpt_0x14(rpt,obuf);break;default:parsed=BADID_PARSE;break;}}//发送void send_cmd(TSIPPKT *cmd, void sendb(char)){char *cbuf, *cbufend;sendb (DLE);sendb (cmd->codes);cbufend = cmd->buf + cmd->len;for (cbuf = cmd->buf; cbuf < cbufend; cbuf++) {if (*cbuf == DLE) sendb (DLE);sendb (*cbuf);}sendb (DLE);sendb (ETX);}void sendb(char outbyte){//ScibRegs.SCITXBUF=outbyte;}//字符交换void bPutShort(unsigned int *in, char *out){char *inptr;inptr=(char *)in;*out= (*inptr>>8) & 0x00FF;*(++out) = *inptr & 0x00FF;}//命令void cmd_0x0(TSIPPKT *cmd,SCICALOUT *out){bPutShort(&(out->ve),&(cmd->buf[0]));cmd->len = 2;cmd->codes =37;}//串口使用中断方式接收,发送不采用中断int input[MAX_RPTBUF];void SCIRXD_ISR(void){tsip_input_proc(&rpt,ScibRegs.SCIRXBUF.bit.RXDT);// analyseif (rpt.status == TSIP_PARSED_FULL) // receive complete{rpt_packet(&rpt,input); // output reportsrpt.status=TSIP_PARSED_EMPTY;// prepare for next}ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;// Clear Overflow flagScibRegs.SCIFFRX.bit.RXFFINTCLR=1;// Clear Interrupt flagPieCtrlRegs.PIEACK.all|= PIEACK_GROUP9; // Issue PIE ack}//发送调用方式//cmd_100x0(&cmd);//send_cmd(&cmd,&sendb);//发送调用方式//cmd_100x0(&cmd);//send_cmd(&cmd,&sendb); 上面的就是源代码。。记住把寄存器改了哦。无论是单片机还是上位机都可以用这个哈。
      485则是教室里面一个老师和很多个学生交谈,当老师(主控设备)点名(即轮询到某个485地址码)要求某个学生(从设备)回答问题,这个学生如果没有翘课(从设备故障或者通信故障)的话,就应答站起来回答问题。在老师点名,学生答问的过程中,都是只有一个人发言,因为485总线有这样的仲裁机制,所以才可以实现点到多点的通信 你在协议里面实现这个功能就可以了,编程是基于串口编程,VB直接调用串口控件的。
      请看 百度百科 串口通讯http://baike.baidu.com/view/542656.htmrs232http://baike.baidu.com/view/196461.htmrs485http://baike.baidu.com/view/542681.htm
      485通信协议怎么规定

      485通讯协议

      阻抗不匹配; 传输线衰减过大;布线环境干扰过大......1.采用特性阻抗为120Ω的RS485专用双绞屏蔽电缆。2.如电缆仅有一层屏蔽,则屏蔽层一端接地(发送端);如采用双层绝缘隔离屏蔽的电缆,则最外层屏蔽两端接地,最内层屏蔽一端接地。3.在信号的接收端并联电阻(约100~120Ω),最佳值可用示波仪加可变电阻器调。1000米的RS485通信建议您采用一对双绞屏蔽电缆,型号规格为:STP-120Ω (for RS485/CAN) one pair 20 AWG,电缆总外径7.70mm.适用于一般工业环境。如需铠装型电缆,则相应的型号规格为:ASTP-120Ω (for RS485/CAN) one pair 18 AWG,电缆的总外径在12..50mm左右。可用于干扰严重、鼠害频繁以及有防爆要求的场所。 联系:hdsr178@yahoo.com.cn
      如果实际环境必须长距离的话,看看PB331吧,供电+通讯只要两根线,有效通讯距离3000米,双绞线或者平行线都行,不用屏蔽,抗干扰比485强,不过要注意末端电压不能低于12V。
      只在ab段并联电阻就可以。
      485通讯协议

      485通讯程序怎么写

      1、涉及到通讯,就要有通讯协议 2、你的485模块是接在单片机吗3、如果485模块接在单片机,要做好485使能端的控制,不能让485出现死锁现象。4、根据通讯协议完成相应的控制功能。 5、祝你成功,嘿嘿
      485是硬件通讯接口,通讯程序是需要协议的。
      485通讯程序怎么写

      MODBUS RS485通讯协议软件怎么写

      呵呵,我也不会,但是我听说MODBUS好像涉及到了寄存器的读写之类的,楼主还是要有心理准备,语言最好还是用C++或者VC,另外的估计会比较麻烦,最好还是不要指望用VB将这个任务完成,呵呵。仅仅只是建议,具体的还是问行家吧,我先捞两分。
      嘿嘿。。简单的你可以用组态软件。。按步骤走就可以了!
      网上有很多VB的程序代码,你可以下载来学习!
      MODBUS RS485通讯协议软件怎么写

      “485通信协议”是什么?

      RS485是物理层不是通讯协议,以RS485为物理层的通讯协议有很多,例如:MODBUS,西门子的PROFIBUS DP , PA, MPI ,PPI ,等等。RS485是物理层,不是通讯协议,以RS485为物理层的通讯协议有很多,例如:MODBUS,西门子的PROFIBUS DP , PA, MPI ,PPI 等等。1、物理层(或称物理层,Physical Layer)是计算机网络OSI模型中最低的一层。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,物理层确保原始的数据可在各种物理媒体上传输。局域网与广域网皆属第1、2层。2、物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。如果您想要用尽量少的词来记住这个第一层,那就是“信号和介质”。OSI采纳了各种现成的协议,其中有RS-232、RS-449、X.21、V.35、ISDN、以及FDDI、IEEE802.3、IEEE802.4、和IEEE802.5的物理层协议。
      RS485是通讯接口,可以用很多种协议在这个接口下走通讯。通常用的协议而言,MODBUS协议较为普遍。但就485接口而言,现在已经不是最方便 的 了,你可以试试二总线接口方案。
      “485通信协议”是什么?

      本文由 在线网速测试 整理编辑,转载请注明出处。

          热门文章

          文章分类