找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3203|回复: 0
打印 上一主题 下一主题
收起左侧

stm32简单的串口modbus-rtu数据处理方法

[复制链接]
跳转到指定楼层
楼主
ID:645302 发表于 2019-12-17 16:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

//crc校验
u16 crc16(u8 *puchMsg, u16 usDataLen)
{
        u8 uchCRCHi = 0xFF ;
        u8 uchCRCLo = 0xFF ;
        u32 uIndex ;
        while (usDataLen--)
        {
                  uIndex = uchCRCHi ^ *puchMsg++ ;
                  uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
                  uchCRCLo = auchCRCLo[uIndex] ;
        }
        return (uchCRCHi << 8 | uchCRCLo) ;
}
//数据校验
unsigned short Check_Dat(unsigned char *pp,unsigned char Dat_len)
{
                        unsigned char Crc_H,Crc_L;
                        Crc_H = (unsigned char )crc16(pp,Dat_len);
                        Crc_L = (unsigned char )(crc16(pp,Dat_len)>>8);

                        if((Crc_H == *(pp+Dat_len))&&(Crc_L ==  *(pp+Dat_len+1)))
                        return Crc_Ok;
                        else
                        {
                                return Crc_Err;
                        }
}


void USART3_IRQHandler(void)//串口接收中断
{
         
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
        {
                        buf[len] =USART_ReceiveData(USART3);//(USART1->DR);
                        len++;
                        if(len>7)//8个字节开始校验
                        {
//                                LEDB=!LEDB;               
                          if( Check_Dat(buf,len)==Crc_Ok)
                                {               
//                                  LEDA=!LEDA;
                                         
                                        MRS485_Receive_Data();//接收数据处理
                               
                                        Rec_Buf_clean(buf,len);清空接收数据
                                        len=0;
                                }
                               
                                if(len>=30)//接收30个字节还未通过校验
                                {
                                        Rec_Buf_clean(buf,len);
                                        len=0;
                                }
                               
                 }
                 
           USART_ClearFlag(USART3,USART_FLAG_RXNE);
               
        }   
}


void Rec_Buf_clean(u8 *point,u8 len ) //清空数组
{
        int p;
        for (p=0;p<len;p++)
        {
                point[p]=0;
        }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表