十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【通讯协议】RS485通讯MODBUS协议实验

【通讯协议】RS485通讯MODBUS协议实验 【通讯协议】RS485通讯MODBUS协议实验文章目录[TOC](文章目录)前言一、串口数据格式二、示波器解析串口数据1.上位机发送数据2.MCU接收数据波形1.加上光耦隔离2.不加光耦隔离三、MODBUS协议格式四、代码1.实验一发送0106000100552.实验二发送0106000100563.实验三发送010600010017五、实验0.实物接线1.实验一2.实验二3.实验三六、参考资料总结前言1.STLINK仿真器2.USB-TTL3.USB转RS4854.RS485转TTL5.STM32控制器6.上位机SSCOM带MODBUS协议提示以下是本篇文章正文内容下面案例可供参考一、串口数据格式串口通信帧数据如此每帧由空闲位、起始位、数据位、校验位、停止位组成传输的数据是低位在前高位在后从低到高1000 1101每位104us9600bps就是每秒传输9600bit位的意思也就相当于1/96001.041666666666667e-4秒为每个bit的传输时间也即104us二、示波器解析串口数据1.上位机发送数据发送字符1对应ASCII理论值十进制为49上位机发送数据波形2、3、4、5、6、7、8、9组成8位数据反馈为 0011 00012.MCU接收数据波形1.加上光耦隔离2.不加光耦隔离可以看出加了光耦数据接收异常不加光耦数据接收正常三、MODBUS协议格式四、代码1.实验一发送0106000100552.实验二发送010600010056voidTestOpr(void){/* 这里只是演示不具实际意义 */if(regGroup[1]0x55){printf(驱动电机A \r\n);regGroup[1]0;//这里是为了防止重复输出}elseif(regGroup[1]0x56){printf(驱动电机B \r\n);regGroup[1]0;//这里是为了防止重复输出}}3.实验三发送010600010017voidUartDriver(void){staticunsignedcharlen;staticunsignedcharbuf[64];unsignedchari;unsignedcharcnt;unsignedintcrc;unsignedcharcrch,crcl;if(From_Flag)//帧接收完成标志即接收到一帧新数据{From_Flag0;//帧接收完成标志清零lenUartRead(buf,sizeof(buf));//将接收到的命令读到缓冲区中crcGetCRC16(buf,len-2);//计算CRC校验值除去CRC校验值crchcrc8;//crc高位crclcrc0xFF;//crc低位printf(485接收数据\r\n);for(i0;ilen;i)printf(485接收的值 buf[%d] %x \r\n,i,buf[i]);if((buf[len-2]crch)(buf[len-1]crcl))//判断CRC校验是否正确{/* 在点对多点的应用中这里还需要加上一条判断报文的地址是否和本机地址一致否则不作处理 *//* 可设置不同从机为不同地址用以区分报文是发给谁的相同则处理不同则不作处理 */switch(buf[1])//按功能码执行操作{case0x03://读数据if((buf[2]0x00)(buf[3]0x05))//寄存器地址支持0x0000~0x0005{if(buf[3]0x04){ibuf[3];//提取寄存器地址cntbuf[5];//提取待读取的寄存器数量buf[2]cnt*2;//读取数据的字节数为寄存器*2因modbus定义的寄存器为16位len3;//响应帧第4个字节开始为数据while(cnt--){buf[len]0x00;//寄存器高字节补0buf[len]regGroup[i];//低字节}}break;}else//寄存器地址不被支持时返回错误码{buf[1]0x83;//功能码最高位置1buf[2]0x02;//设置异常码为02-无效地址len3;break;}case0x06://写入单个寄存器if((buf[2]0x00)(buf[3]0x05))//寄存器地址支持0x0000-0x0005{if(buf[3]0x04){ibuf[3];//提取寄存器地址regGroup[i]buf[5];//保存寄存器数据}len-2;//长度-2以重新计算CRC并返回原报文break;}else{//寄存器地址不被支持返回错误码buf[1]0x86;//功能码最高位置1buf[2]0x02;//设置异常码为02-无效地址len3;break;}default://其他不支持的功能码buf[1]0x80;//功能码最高位置1buf[2]0x01;//设置异常码为01—无效功能len3;break;}crcGetCRC16(buf,len);//计算CRC校验值buf[len]crc8;//CRC高字节buf[len]crc0xff;//CRC低字节Send_Data(buf,len);//发送响应帧}else/* 如果校验值错误执行错误处理函数 这里用串口1打印一条提示信息 也可自定义共它处理函数 */printf(接收错误\r\n);}}五、实验0.实物接线USB-TTL TXD- MCU-RXD PA10USB-TTL RXD- MCU-RXD PA9USB转485 A- RS485转TTL AUSB转485 B- RS485转TTL BUSB转485 RXD- MCU-RXD PA3USB转485 TXD- MCU-TXD PA2USB转485 GND- MCU-GNDUSB转485 VCC- MCU-VCC1.实验一2.实验二3.实验三六、参考资料MODBUS通讯协议中文版.pdf隔离串口通信电路设计注意事Ascii256个 编码表 完整码表 ASCII编码 ASCII表 ASCII码 二进制 十进制 八进制 十六进制隔离串口通信电路设计注意事STM32开发六STM32F103 通信 —— RS485 Modbus通信编程详解STM32F1之485通信STM32F103C8T6的MODBUS-RTU通讯485通讯基于STM32以及modbus——RTU的从机程序STM32作为从机并行串行同步异步与UART串口TTLRS232RS485相关概念认识与解读总结本文仅仅简单介绍了【通讯协议】RS485通讯MODBUS协议实验评论区欢迎讨论。
返回列表