【蓝桥杯嵌入式备赛】其七:12、13届省赛技巧记录,如何在Linux运维-Studio下进行NDK开发

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

```
+ 使用寄存器直接修改比较值
```
htim2.Instance->CCR2 = pulseVal;

```
+ 不难发现通过修改重装载值也可以调整输出信号的占空比,但是由于重装载值会对频率和占空比同步产生影响,所以在使用时根据要求需要仔细计算。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/42232794ff2c485ba21a4ee0f71132a8.bmp)

3、串口通信

  • 串口收发函数
    在这里插入图片描述

    • 阻塞式发送函数:不发完芯片不继续运行
    HAL\_StatusTypeDef HAL\_UART\_Transmit(UART\_HandleTypeDef \*huart, uint8_t \*pData,   uint16_t Size, uint32_t Timeout);
    /\* 阻塞式发送函数,发送未完成时函数阻塞 \*/
    /\*
    huart 参数: 实例,句柄,如 &huart1
    pData 参数: 存放要发送的数据的指针
    Size 参数: 存放要发送的数据的长度
    Timeout 参数:超时时间,超过此长度仍未发送成功则阻塞完毕,停止发送,函数执行完毕
    \*/
    
    
    • 非阻塞式发送函数:芯片正常运行,串口发完会引发中断之后进入中断回调函数。
    HAL\_StatusTypeDef HAL\_UART\_Transmit\_IT(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size);
    /\* 非阻塞式发送函数,发送一半时或完毕后响应发送中断 \*/
    /\*huart 参数: 实例,句柄如 &huart1
    pData 参数: 存放要发送的数据的指针
    Size 参数: 存放要发送的数据的长度
    \*/
    __weak void HAL\_UART\_TxCpltCallback(UART\_HandleTypeDef \*huart);
    /\* 发送完毕中断回调函数 \*/
    __weak void HAL\_UART\_TxHalfCpltCallback(UART\_HandleTypeDef \*huart);
    /\* 发送一半中断回调函数 \*/
    
    
    • 阻塞式接收函数
    HAL\_StatusTypeDef HAL\_UART\_Receive(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size, uint32_t Timeout);
    
    
    • 非阻塞式接收函数
    HAL\_StatusTypeDef HAL\_UART\_Receive\_IT(UART\_HandleTypeDef \*huart, uint8_t \*pData, uint16_t Size);
    __weak void HAL\_UART\_RxCpltCallback(UART\_HandleTypeDef \*huart);
    /\* 接收完毕中断回调函数 \*/
    __weak void HAL\_UART\_RxHalfCpltCallback(UART\_HandleTypeDef \*huart);
    /\* 接收一半中断回调函数 \*/
    
    
  • 串口获取输入信息:通过sscanf获取串口输入的信息并进行储存,获取完成后需要将缓冲数组和数组指针清零以便下一次接收。
    在这里插入图片描述

sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);	
//清零
rx_pointer=0;
memset(rxdata,0,30);

  • 串口输出指定信息
char temp[20];
sprintf(temp,"Error");
HAL\_UART\_Transmit(&huart1,(uint8_t\*)temp,strlen(temp),50);

char temp[20];
sprintf(temp,"%cNBR:%c%c%c%c:%ld:%.2f",&car_data[i].Car_Type,car_data[i].Car_Num[0],car_data[i].Car_Num[1],car_data[i].Car_Num[2],car_data[i].Car_Num[3],H,money);
HAL\_UART\_Transmit(&huart1,(uint8_t\*)temp,strlen(temp),50);

  • 重定向输出:串口也可以使用printf()函数进行重定向从而输出,但不知道为什么使用printf函数时,LCD屏无法初始化也无法启用,现在还没有找到原因。
//重定向printf函数为串口输出
int fputc(int ch,FILE \*p){
  char c = ch;
  HAL\_UART\_Transmit(&huart1,(unsigned char \*)&c, 1, 50);
  return ch;
  }

4、日期时间转换与时间计算

  • 将输入信息转换为年月日
//计算年月日时分秒
Year = 2000 + (rxdata[10] - 0x30) \* 10 + (rxdata[11] - 0x30);
Mon  = (rxdata[12] - 0x30) \* 10 + (rxdata[13] - 0x30);
Day  = (rxdata[14] - 0x30) \* 10 + (rxdata[15] - 0x30);
Hour = (rxdata[16] - 0x30) \* 10 + (rxdata[17] - 0x30);
Min  = (rxdata[18] - 0x30) \* 10 + (rxdata[19] - 0x30);
Sec  = (rxdata[20] - 0x30) \* 10 + (rxdata[21] - 0x30);

  • 使用sscanf获取年月日信息:其中sscanf(input, "%[^:]:%*[^:]:%s", info, datetime);为格式化字符串,用于指定 sscanf 如何解析 rxdata 中的数据:

    • %[^:] :匹配非冒号字符的任意序列,因此它会匹配信息字段,info 是用来存储这个字段的数组。
    • :%*[^:] :匹配一个冒号后面紧跟着的任意字符序列,但是由于 %* 的存在,这个部分的匹配结果会被忽略,所以它会跳过信息字段后的冒号和其后的字符。
    • %s: 匹配任意非空白字符序列,因此它会匹配日期时间字段,datetime 是用来存储这个字段的数组。
  char info[10], datetime[14];
  sscanf(input, "%[^:]:%\*[^:]:%s", info, datetime);
  //计算年月日时分秒
  sscanf(datetime, "%.2d%.2d%.2d%.2d%.2d%.2d", &Year, &Mon, &Day, &Hour, &Min, &Sec);
  Year+=2000;

  • Unix时间与格林尼治时间相互转换
      mktime():将时间转换为自1970年1月1日以来逝去时间的秒数,发生错误时返回-1。也就是是把获取的时间转换成时间戳。
      gmtime():返回tm结构的格林尼治时间(GMT)。
 // 将tm结构体转换为Unix时间戳
  time_t unix_time = mktime(&tm_info);
  // 将Unix时间戳转换为标准时间格式
  struct tm \*standard_time = gmtime(&unix_time);
  // 输出转换后的标准时间格式和信息
   printf("标准时间格式:%.4d-%.2d-%.2d %.2d:%.2d:%.2d\n",
          standard_time->tm_year + 1900, standard_time->tm_mon + 1,
          standard_time->tm_mday, standard_time->tm_hour,
          standard_time->tm_min, standard_time->tm_sec);

  • 计算时间间隔时可以将年月日转换为Unix时间便于计算
struct tm tm_info;
//视为出场,计算出场时间
  	  tm_info.tm_year = Year - 1900;
  	  tm_info.tm_mon = Mon - 1;
  	  tm_info.tm_mday = Day;
  	  tm_info.tm_hour = Hour;
  	  tm_info.tm_min = Min;
  	  tm_info.tm_sec = Sec;
  	  tm_info.tm_isdst = -1; //夏令时
  	  
  	  car_out = mktime(&tm_info); //将年月日时间转换成Unix时间,便于计算
  	  if(car_out==-1) {
  		char temp[20];
  		sprintf(temp,"Error7");HAL\_UART\_Transmit(&huart1,(uint8_t\*)temp,strlen(temp),50);
  		goto Error;
        }
  	  
  	  //计算本次出场车辆的入场时间
  	  tm_info.tm_year = car_data[i].Year - 1900;
  	  tm_info.tm_mon = car_data[i].Mon - 1;
  	  tm_info.tm_mday = car_data[i].Day;
  	  tm_info.tm_hour = car_data[i].Hour;
  	  tm_info.tm_min = car_data[i].Min;
  	  tm_info.tm_sec = car_data[i].Sec;
  	  tm_info.tm_isdst = -1; //夏令时
  	  //将入场年月日时间转换成Unix时间,便于计算
  	  car_in = mktime(&tm_info);
  	  //出场时间减去入场时间,结果为车辆在停车场的时间(单位为秒)
  	  input_time=car_out - car_in;



### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/eac6f5d357e440e012dd28d000b5b99c.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/2b1116cf23954d95ec8283c8c0320e75.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**


**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
![img](https://img-blog.csdnimg.cn/img_convert/2c85cf1223960e108f9ba56df026328e.jpeg)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
[外链图片转存中...(img-Tr5uM5PY-1713472053826)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值