14-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,单片机程序编写

https://www.cnblogs.com/yangfengwu/p/11102026.html

首先规定下协议  ,CRC16就不加了哈,最后我会附上CRC16的计算程序,大家有兴趣自己加上

上位机发送:

0xaa 0x55  0x03  占空比(高电平时间高位)  占空比(高电平时间低位)    

单片机解析协议,然后修改占空比

 

 先用调试助手发几个数据测试一下 

aa 55 03 03 E8     1000

aa 55 03 01 F4     500

aa 55 03 00 64     100

aa 55 03 00 00     0

   

   

   

   

 给大家C语言计算CRC的程序

/**
* @brief  计算CRC
* @param  *modbusdata:数据指针
* @param  length:数据长度
* @param  
* @retval 计算的CRC值
* @example 
**/
int crc16_modbus(u8 *modbusdata, int length)
{
    int i, j;
    int crc = 0xffff;//有的使用0
    for (i = 0; i < length; i++)
    {
            crc ^= modbusdata[i];
            for (j = 0; j < 8; j++)
            {
                    if ((crc & 0x01) == 1)
                    {
                            crc = (crc >> 1) ^ 0xa001;
                    }
                    else
                    {
                            crc >>= 1;
                    }
            }
    }
    
    return crc;
}

/**
* @brief  判断数据的CRC校验是否正确
* @param  *modbusdata:数据指针
* @param  length:数据长度
* @param  
* @retval 1 正确  0 错误
* @example 
**/
int crc16_flage(u8 *modbusdata, int length)
{
    int Receive_CRC=0,calculation=0;//接收到的CRC,计算的CRC
    
    Receive_CRC = crc16_modbus(modbusdata, length);
    calculation = modbusdata[length+1];
    calculation <<= 8;
    calculation += modbusdata[length];
    if(calculation != Receive_CRC)
    {
        return 0;
    }
    return 1;
}

 好了下节再做上位机程序

猜你喜欢

转载自www.cnblogs.com/yangfengwu/p/11104167.html