STM32F107串口1通讯modbus学习示例_第1页
STM32F107串口1通讯modbus学习示例_第2页
STM32F107串口1通讯modbus学习示例_第3页
STM32F107串口1通讯modbus学习示例_第4页
STM32F107串口1通讯modbus学习示例_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx*1*1*1*1*1*1*1*1*1*1*TxTxTxTxTxTxTxTxTxTx*文件名称:*功能描述:STM32F107串口1通讯*参数:None*返回值:None*作者:汪仁海*日期:2013年1月28日*修改人:*日期:*TxTxTxTxTxTxTxTxTxTxTxTxTxTx

2、TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx*1*1*1*1*1*1*1*1*1*1*/TxTxTxTxTxTxTxTxTxTx/#includemain.h#defineUSART1_USART1_Addr0 x01定义设备地址#defineUSART1_GetDataNum50/定义接收数据最大长度#defineUSART1_OutDataNum50/定义发送数据最大长度#de

3、fineUSART1_RTU_03ReadOrder0 x04/定义mobusRTU03读指令#defineUSART1_RTU_04ReadOrder0 x03/定义mobusRTU04读指令#defineUSART1_RTU_04WriteOrder0 x10定义mobusRTU04写指令,在定义地址寄存器内操作#defineUSART1_TIM2_COUNT3/串口接收数据超计数常数u8USART1_GetDataUSART1_GetDataNum;定义接收数组u8USART1_GetDataCpyeUSART1_GetDataNum;定义接收数组有效数据暂存区u8USART1_OutD

4、ataUSART1_OutDataNum;定义发送数组u16USART1_MobusWordUSART1_MobusWordNum;/MOBUSRTU寄存器16bit字节数组u8USART1_GetDataCount;/串口接收数据个数u8USART1_GetDataCountCpye;串口接收数据个数转存区u8USART1_OutDataCount;串口发送数据个数u8USART1_GetDataFlag;/串口接收数据继续有效标识符,0为无效,大于0为有效u16USART1_GetMobusAddr;串口接收到指令操作地址u16USART1_GetMobusAddrCpye;串口接收到指令

5、操作地址u8USART1_GetMobusOrder;串口接收到指令操作命令u8USART1_GetMobusOrderCpye;串口接收到指令操作命令u8USART1_GetMobusLen;串口接收到指令操作数据长度u8USART1_GetMobusOrderFlag;串口接收到指令操作数据是否有效标记符/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*对外输入输出接口

6、函数部分*/u8USARTl_GetMobusOrder_Flag(void)串口接收到指令操作数据是否有效标记符returnUSARTl_GetMobusOrderFlag;voidUSART1_GetMobusOrder_SetFlag(u8ch)/设置串口指令操作数据标记符USART1_GetMobusOrderFlag=ch;u16ReadMobusWord(u16addr)/读Mobus数组指定地址的数据if(addr=USART1_MobusWordAddr)&(addr=USART1_MobusWordAddr)&(addr(USART1_MobusWordAddr+USART1

7、_MobusWordNum)USART1_MobusWordaddr-USART1_MobusWordAddr=data;return1;elsereturn0;/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*初始化函数*/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*

8、1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*数据初始化*/voidUSART1_InitData(void)u16i=0;for(i=0;iUSART1_GetDataNum;i+)USART1_GetDatai=0;USART1_GetDataCp

9、yei=0;for(i=0;iUSART1_OutDataNum;i+)USART1_OutDatai=0;for(i=0;iUSART1_MobusWordNum;i+)USART1_MobusWordi=i;/USART1_MobusWordi=0;USARTl_MobusWord0=USARTl_USARTl_Addr;起始寄存器为该设备的地址USARTl_GetDataCount=0;串口接收数据个数USART1_GetDataCountCpye=0;串口接收数据个数转存区USART1_GetDataFlag=0;串口接收数据继续有效标识符USART1_GetMobusLen=0;串口

10、接收到指令操作数据长度/*串口过时接收复位函数*/voidUSART1_IsReset(void)串口过时接收复位函数if(USART1_GetDataFlag1)USART1_GetDataCount=0;串口接收数据个数清零elseUSART1_GetDataFlag-;/串口接收数据标识符减/TxTxTxTxTx/*指令有效判断函数*/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1

11、*1*1*1*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*返回指定数值指定长度字符串的CRC值*/u16GetCRC16(u8ch,u16len)/返回指定数值指定长度字符串的CRC值u16i,j;u16crc=0 xFFFF;if(len=0)len=1;for(j=0;jlen;j+)crcA=chj;for(i=0;i=1;crcA=0 xA001;elsecr

12、c=1;return(crc);/*判断指定数值,指定长度的最后两位CRC值是否正确*/ul6IsCRC16(u8ch,ul6len)/判断指定数值,指定长度的最后两位CRC值是否正确u16a,b;b=0 x0000;a=GetCRC16(ch,len-2);b=(b|chlen-1)8)|chlen-2;if(a=b)return1;elsereturn0;u8IsGetCharAddr(void)/判断接收到得指令地址是否有效u8flagAddr=0,flagCRC=0;u16GetCharAddr=0 x0000;GetCharAddr=USART1_GetDataCpye2;GetCh

13、arAddr=(GetCharAddr=USART1_MobusWordAddr)&(GetCharAddr8)&0 xff;ch4=data&0 xff;data=GetCRC16(ch,5);/返回指定数值指定长度字符串的CRC值ch6=(data8)&0 xff;ch5=data&0 xff;Uart1PutCharNum(ch,7);break;caseUSART1_RTU_04WriteOrder:/04指令写操作if(USART1_GetDataCpye4=0 x00)&(USART1_GetDataCpye5=0 x01)/只允许写一个字符data=USART1_GetDataC

14、pye7;WriteMobusWord(USART1_GetMobusAddrCpye,(data8)&0 xff;ch3=data&0 xff;ch4=0 x00;ch5=0 x01;data=GetCRC16(ch,6);/返回指定数值指定长度字符串的CRC值ch7=(data8)&0 xff;ch6=data&0 xff;Uart1PutCharNum(ch,8);break;default:break;/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1

15、*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*串口处理函数*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx

16、TxTxTxTxTxTxTxTxTxTxTx/函数名:USARTl_Configuration输入:输出:功能说明:初始化串口硬件设备,启用中断配置步骤:打开GPIO和USART1的时钟设置USART1两个管脚GPIO模式配置USART1数据格式、波特率等参数使能USART1接收中断功能(5)最后使能USART1功能/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/voi

17、dUSART1_Configuration(void)GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;/RS485控制引脚配置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*第1步:打开GPIO和USART部件

18、的时钟*/*第2步:将USARTTx的GPIO配置为推挽复用模式*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*第3步:将USARTRx的GPIO配置为浮空输入模式由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置

19、参数*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);/*第4步:配置USART1参数BaudRate=115200baudWordLength=8BitsOneStopBitNoparityHardwareflowcontroldisabled(RTSandCTSsignals)Receive

20、andtransmitenabled*/USART_InitStructure.USART_BaudRate=2400;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControlUSART_HardwareFlowControl_None;USART_

21、InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);/*若接收数据寄存器满,则产生中断*/USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);/USART_ITConfig(USART1,USART_IT_TXE,ENABLE);/*第5步:使能USART1,配置完毕*/USART_Cmd(USART1,ENABLE);/*如下语句解决第1个字节无法正确发送出去的问题*/USART_ClearFlag(USART1,USART

22、_FLAG_TC);/清标志USARTl_InitData();初始化数据/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/TOC o 1-5 h z/*/*STM32串口1的RS485读写设置*/*0:读外部数据*/*1:向外发送数据*/u8SetUart1_RS485(u8ch)u32i;if(ch=1)/发送状态GPIO_SetBits(GPIOA,GPIO_Pin_8

23、);for(i=0;iv15000;i+)延时1050nselse/接收状态for(i=0;iv15000;i+)延时1050nsGPIO_ResetBits(GPIOA,GPIO_Pin_8);returnGPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8);/*/*/*/*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/voidUart1_P

24、utChar(u8ch)SetUart1_RS485(1);USART_SendData(USART1,(u8)ch);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=RESET);SetUart1_RS485(0);/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxT

25、xTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*/*STM32向串口1发送一串字节/*/*/*/*/*/u8Uart1PutCharNum(u8ch,u8num)u8i;SetUart1_RS485(1);for(i=0;inum;i+)USART_SendData(USART1,chi);while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)=RESET);SetUart1_RS485(

26、0);returni;/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*/TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTx/*/*STM32在串口1接收1字节

27、/*说明:串口1接收中断/*/*/*/*/voidUSART1_IRQHandler(void)u8USART1GetData,i;/*串口接收寄存器满中断处/*STM32向串口1发送1字节/*if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)/若接收数据寄存器满USART1GetData=USART_ReceiveData(USART1);USARTl_GetDataFlag=USARTl_TIM2_C0UNT;串口接收数据继续有效标识符/接收数据到缓冲区if(USARTl_GetDataCountUSARTl_GetDataNum)USAR

28、Tl_GetDataUSARTl_GetDataCount+=USARTlGetData;elseUSARTl_GetDataCount=0;USARTl_GetDataUSARTl_GetDataCount+=USARTlGetData;/判断接收数据指令设备地址if(USARTl_GetDataCount=l)if(USARTl_GetData0!=USARTl_USARTl_Addr)USART1_GetDataCount=0;串口接收数据复位/判断指令命令类型if(USART1_GetDataCount=2)if(USART1_GetData1=USART1_RTU_04ReadOrd

29、er)/4x读命令USART1_GetMobusLen=8;串口接收到指令操作数据长度USART1_GetMobusOrderCpye=USART1_RTU_04ReadOrder;串口接收到指令操作命令elseif(USART1_GetData1=USART1_RTU_04WriteOrder)/4x写命令USART1_GetMobusLen=11;串口接收到指令操作数据长度USART1_GetMobusOrderCpye=USART1_RTU_04WriteOrder;串口接收到指令操作命令elseUSART1_GetDataCount=0;串口过时接收复位函数/接收完一个读写指令TxTx

30、TxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxTxif(USART1_GetDataCount=USART1_GetMobusLen)/USART1_GetDataCountCpye=USART1_GetMobusLen;for(i=0;iUSART1_GetDataCountCpye;i+)USART1_GetDataCpyei=USAR

31、T1_GetDatai;USARTl_GetMobusOrderFlag=l;串口接收到指令操作数据是否有效标记符/Uartl_PutChar(USARTlGetData);/*文件名称*功能描述*参数SysTick时钟处理串口1数据例None*返回None*作者:汪仁海*日期:2013年1月28日*修改人:*日期:*#includemain.hu16SysTick_count;voidSysTick_Configuration(void)/运行状态指示灯闪烁引脚定义GPIO_InitTypeDefGPIO_InitStructure;/控制引脚配置GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;GPIO_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论