STM32F103系列单片机与具备MODBUS-RTU通讯协议的设备通讯案例

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includestm32f10x.h#includeModbus.hunsignedcharAO[30];unsignedcharAI[30];unsignedcharaddress_judgment(void){if(Receive[0]==Drive_address)return(1);elsereturn(0);}voidmodbus_init(void){unsignedchari;for(i=0;i128;i++){Receive[i]=0;Send[i]=0;}}unsignedcharFunction_judgment(void){Rec=&Receive[0];Transmit=&Send[0];if((*(Rec+1)==0x01)||(*(Rec+1)==0x02)||(*(Rec+1)==0x03)||(*(Rec+1)==0x04)||(*(Rec+1)==0x05)||(*(Rec+1)==0x06))/*判断功能码*/{switch(Receive[1]){case1:function_flag=1;Max_Output_Quantity=2000;Start_address=0;Output_Quantity=*(Rec+4)8|*(Rec+5);break;/*依据接收到的功能码确定协议规定的输出数量*/case2:function_flag=1;Max_Output_Quantity=2000;Start_address=10000;Output_Quantity=*(Rec+4)8|*(Rec+5);break;/*依据接收到的功能码确定协议规定的输出数量*/case3:function_flag=1;Max_Output_Quantity=125;Start_address=40000;Output_Quantity=*(Rec+4)8|*(Rec+5);break;/*依据接收到的功能码确定协议规定的输出数量*/case4:function_flag=1;Max_Output_Quantity=125;Start_address=30000;Output_Quantity=*(Rec+4)8|*(Rec+5);break;/*依据接收到的功能码确定协议规定的输出数量*/case5:function_flag=0;Max_Output_Quantity=1;Start_address=0;Output_Value=*(Rec+4)8|*(Rec+5);break;case6:Start_address=40000;break;default:break;}if(function_flag==1){if(Output_Quantity=1&&Output_Quantity=Max_Output_Quantity)/*判断输出数量*/{if(((*(Rec+2)8)|*(Rec+3)=Start_address)&&(((*(Rec+2)8)|*(Rec+3))=Start_address+Max_Output_Quantity)){return(0);}/*判断起始地址和输出数量*/else{return(0x02);}return(0);}else{return(0x03);}/*输出数量错误,返回异常码*/return(0);}if(function_flag==0){if((Output_Value==0xff00)||(Output_Value==0x0000))/*判断输出值是否等于0xff00或0x0000*/{if(((*(Rec+2)8)|*(Rec+3)=Start_address)&&(((*(Rec+2)8)|*(Rec+3))=16)){return(0);}/*判断起始地址和输出数量*/else{return(0x02);}return(0);}else{return(0x03);}/*输出数量错误,返回异常码*/return(0);}}else{return(0x01);}/*功能码错误,返回异常码*/}voidmosbus_error(void){Send[0]=Receive[0];/*从机地址*/Send[1]=Receive[1]|0x80;/*0x80+功能码*/Send[2]=Function_judgment();/*0x80+功能码*/crc_cal_value(Transmit,3);Send[3]=crc_value&0X00FF;Send[4]=crc_value8;for(T_Count=0;T_Count7;T_Count++){USART_SendData(USART2,Send[T_Count]);while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);}}voidModbus(void){//unsignedcharbit_count;//unsignedcharbyte_Count;//unsignedcharnum=6;//unsignedchari;AO[0]=20;AO[1]=30;AO[2]=33;AO[3]=55;AO[4]=22;AO[5]=12;switch(Receive[1]){case0x01:num=3;i=0;byte_Count=0;DO=GPIOC-ODR(Receive[3]|Receive[2]);Send[0]=Receive[0];/*从机地址*/Send[1]=Receive[1];/*功能码*/if(((Receive[5]|Receive[4])%8)==0){Send[2]=(Receive[5]|Receive[4])/8;/*读取线圈的字节数*/}else{Send[2]=((Receive[5]|Receive[4])/8)+1;/*读取线圈的字节数*/}for(bit_count=0;bit_count(Receive[5]|Receive[4]);bit_count++){if(i==9){i=0;num++;byte_Count++;}bit_flag=DO&0x01;/*判断输出寄存器的位状态,0或者1*/if(bit_flag==1){Send[num]=Send[num]|(1i);}else{Send[num]&=~(1i);}DO=DO1;i++;}crc_cal_value(Transmit,4+byte_Count);Send[num+1]=crc_value&0X00FF;Send[num+2]=crc_value8;break;功能码0x02、0X03、0X04、0X05、0X06、功能码请与版主联系(微信348460102)*******************************************************************************default:break;}for(T_Count=0;T_Count15;T_Count++){USART_SendData(USART2,Send[T_Count]);while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);}}voidUSART_Configurtion(void){USART_InitTypeDefUSART_InitStructure;USART_DeInit(USART2);USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;USART_Init(USART2,&USART_InitStructure);USART_Cmd(USART2,ENABLE);//USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE);}voidDMA_Configuration(void){DMA_InitTypeDefDMA_InitStructure;DMA_DeInit(DMA1_Channel6);DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&USART2-DR;DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&Receive;DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//????????????DMA_InitStructure.DMA_BufferSize=8;//DMA???DMA?????DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//?????????DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//?????????DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;//?????16?ByteHalfWordDMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;//?????16?DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//?????????DMA_InitStructure.DMA_Priority=DMA_Priority_High;//DMA??x??????DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//DMA??x????????????DMA_Init(DMA1_Channel6,&DMA_InitStructure);DMA_Cmd(DMA1_Channel6,ENABLE);//??DMA??}voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;#ifdefVECT_TAB_RAMNVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);#elseNVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);#endifNVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel6_IRQn;/*USART1中断配置//DMA1_Channel6_IRQnNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);}u16crc_cal_value(u

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功