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

rs485通讯协议详解
RS-485上的软件层协议ModBus主要依赖于主从模式。主从机的数据交互,需要:a. 主机将自己转为发送状态。b. 主机按照预先约定的格式发出寻址数据帧。c. 主机恢复自身的接收状态。所谓的约定,可是主机开发者和从机开发者约定好的规约,例如主机要通过从机控制接在从机的电机,主机要启动电机就往从机发0x1,停止电机就往从机发0x2。这就是一种预先约定好的格式,但是这样做,互换性、兼容性、通用性差。例如其他公司是约定发送0x03让电机转动,发0x04让电机停止。导致不同厂家的主机、从机不能相互通讯。用户需要的,就像网络操作,只要接入有网的网线那么计算机都能上网。所以说,需要一种大家都共同遵循的规则(可以是ModBus,也可以是TCP/IP等上层协议)。软件层协议主要是解决如何解析传输的数据,即传输的目的或者更加可靠的传输数据。半双工通讯中,都是主机寻找从机,主机的目的无非有主机要发数据给从机,或者主机要从从机中获取数据。主机等待自身所寻址的从机作回应,也就是说从机接收到主机的寻址命令、数据后一定要回应主机,不然主机会认为从机通讯异常。扩展资料;RS-485的特点;1、RS-485的电气特性:逻辑“1”以两线间的电压差为+(2-6)V表示,逻辑“0”以两线间的电压差为-(2-6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。2、RS-485的数据最高传输速率为10Mbps。3、RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。4、RS-485接口的最大传输距离标准值为4000英尺,实际上可达3000米,另外RS-232-C接口在总线上只允许连接1个收发器,即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。5、因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS-485接口组成的半双工网络,一般只需二根连线,所以RS-485接口均采用屏蔽双绞线传输。RS-485接口连接器采用DB-9的9芯插头座,与智能终端RS-485接口采用DB-9(孔),与键盘连接的键盘接口RS-485采用DB-9(针)。

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通讯协议
阻抗不匹配; 传输线衰减过大;布线环境干扰过大......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通讯协议程序怎么写(51单片机的485通
485通讯和232通讯基本差不多的。程序基本一样。并且也可以用串口发送,只是485增加了一个专门的驱动电路而已。

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