BCC异或校验 Linux C

1、BCC异或校验

从输入的HEX第一个字节开始,按字节依次循环计算异或值直到HEX结尾字节,得到的最终一个字节值。

2、C程序

/*******************************************************************************
_____ ___ ____  ___   _____    _             _   _             
| ____|_ _|  _ \|_ _| |_   _|__(_)_ __   __ _| | | |_   _  __ _ 
|  _|  | || |_) || |    | |/ __| | '_ \ / _` | |_| | | | |/ _` |
| |___ | ||  _ < | |    | |\__ \ | | | | (_| |  _  | |_| | (_| |
|_____|___|_| \_\___|   |_||___/_|_| |_|\__, |_| |_|\__,_|\__,_|
  * File Name          : main.c
  * Description        : This file provides code for bcc caculation in linuxc.
  * Author             : jackwang by jiawang16@foxmail.com
  * Date               : 2019-03-09
*******************************************************************************/
/*! -------------------------------------------------------------------------- */
/*! Include headers */
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

/*! -------------------------------------------------------------------------- */
/*! Private function declarations */
static unsigned char Char2Int(char chr,bool *isOK);/*! convert char to int type*/
static unsigned char HexStr2Int(char *str, bool *isOK);/*!convert hexstr to int*/

/*! -------------------------------------------------------------------------- */
/*! main function defination */
int main(int argc, char* argv[])
{
  int ret = 0;
  int numByte = argc; 
  char bccVal = 0x00;
  char inPutbuff[10];
  
  bool isOK;
  int Nibb;
  
  if(argc == 1){
    printf("[note]  no params to caculate, please input hex string, splite by space!\r\n");
  }
  else{
    printf("[note]  input %d byte: ",numByte-1);
    for(int i = 1; i < numByte; i++){
      printf("%s ",argv[i]);
    }
    printf("\r\n");

    for(int i = 1; i < numByte; i++){
      memcpy(inPutbuff,argv[i],2);
      Nibb = HexStr2Int(inPutbuff,&isOK);
      if(isOK){
        bccVal ^= (char)Nibb;
      }
    }
    printf("\r\n");
    printf("[note]  bcc value: %02X\r\n",bccVal);
  }
  return 0;
}

/*! -------------------------------------------------------------------------- */
/*! Private function definations */
/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static int Char2Int(char chr,bool *isOK)
{
  int nibb1;
  if(chr >= '0' && chr <= '9'){ nibb1 = chr - '0'; *isOK = true;}
  else if(chr >= 'a' && chr <= 'f'){ nibb1 = chr - 'a' + 10; *isOK = true;}
  else if(chr >= 'A' && chr <= 'F'){ nibb1 = chr -'A' + 10; *isOK = true; }
  else{  printf("[error]  invalid hex str input: %c \r\n",chr); *isOK = false; }
  return nibb1;
}
/*! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
static int HexStr2Int(char *str, bool *isOK)
{
  int nibb1,nibb2;
  bool isOK1,isOK2;
  nibb1 = Char2Int(*str, &isOK1);
  nibb2 = Char2Int(*(str+1),&isOK2);
  
  if(isOK1 && isOK2){
    *isOK = true;
    return nibb1*16 + nibb2;
  }
  else{
    *isOK = false;
    return 0;
  }
} 

3、编译

~$ gcc main.c -o getbcc

4、使用


~$ ./getbcc 01 02 03 04 11
~$ [note]  input 5 byte: 01 02 03 04 11
~$ [note]  bcc value: 15

 

### STM32智能厨房设备中的应用 #### 使用STM32实现温度监控系统 为了确保烹饪过程的安全性和效率,可以利用STM32微控制器创建一个精确的温度监测解决方案。该方案能够实时采集炉灶或其他加热装置表面的温度数据,并通过LCD显示屏向用户提供反馈。当检测到异常高温时,系统会自动触发警报机制并切断电源供应以防止火灾发生[^1]。 ```c // 温度传感器读取函数示例 float readTemperature(void){ float temperature; // 模拟ADC转换获取当前环境温度值 ADC_ChannelConfTypeDef sConfig = {0}; HAL_ADC_Start(&hadc); if (HAL_ADC_PollForConversion(&hadc, 10) == HAL_OK){ uint32_t rawValue = HAL_ADC_GetValue(&hadc); temperature = ((rawValue * 3.3f)/4096)*100; // 将ADC数值转化为摄氏度 } HAL_ADC_Stop(&hadc); return temperature; } ``` #### 开发基于STM32的食物保鲜提醒器 另一个有趣的项目是食物保存期限管理工具。此应用程序允许用户输入食品购买日期以及预计过期时间;之后借助内部RTC模块定时唤醒MCU检查是否有即将到期的商品并向手机发送通知消息提示主人及时处理这些物品以免浪费资源。 ```c void setupFoodExpiryReminder(uint8_t dayOffset){ RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef DateToUpdate = {0}; /* 设置RTC的时间 */ sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0; /* 配置指定天数后的日期作为闹钟触发条件 */ DateToUpdate.WeekDay = __HAL_RTC_GET_WEEKDAY(&hrtc)+dayOffset%7; DateToUpdate.Month = (__HAL_RTC_GET_MONTH(&hrtc)+((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)/30))%12?(__HAL_RTC_GET_MONTH(&hrtc)+((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)/30)):12; DateToUpdate.Date = ((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)%30)?((__HAL_RTC_GET_DATE(&hrtc)+dayOffset)%30):30; } /* 定义中断服务程序用于发出警告音调 */ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc){ Buzzer_ON(); } ``` #### 构建联网型智能烤箱控制系统 对于更高级别的需求来说,则可以通过Wi-Fi模组使传统家用电器具备互联网连接功能——比如一款支持远程控制操作参数设定(如预热温度、烘焙模式选择等)并通过移动APP界面直观展示运行状态信息给用户的智能烤箱产品就是很好的例子之一。这类产品的核心在于良好地集成各种外设接口并与云平台交互完成指令下发与接收工作流程优化。 ```json { "method": "setTargetTemp", "params": { "target_temperature_celsius": 180, "mode": "bake" }, "id": 1 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值