当前位置: 首页 > news >正文

可以用AI做网站上的图吗建网站手机软件

可以用AI做网站上的图吗,建网站手机软件,网站设计连接数据库怎么做,找能做网站的知不足而奋进望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中#xff0c;封装抽取流程和抽取封装策略是非常重要的技术#xff0c;能够提高代码的复用性和可维护性。本文将介绍如何在文…知不足而奋进·望远山而前行 目录 文章目录 前言 目标 内容 开发流程 文件目录创建 分组创建 接口定义 完整代码 总结 前言 在嵌入式软件开发中封装抽取流程和抽取封装策略是非常重要的技术能够提高代码的复用性和可维护性。本文将介绍如何在文件系统中创建库目录并通过keil工程中创建分组管理库的方式实现串口功能的封装和抽取。通过具体的步骤和代码示例帮助读者掌握封装抽取流程和策略。 目标 掌握封装抽取流程掌握抽取封装策略 内容 开发流程 在文件系统中创建库目录Library在keil工程中创建分组管理库Library编写中间件逻辑使用中间件 文件目录创建 在工程根目录创建Library目录在这个目录中创建具体的功能目录当前是做串口功能我们新建usart。 分组创建 创建Library分组。右键进入Manage Project Items 右键创建头文件和c文件 添加include引入 接口定义 初始化及发送功能定义 void USART0_init(void);// 发送1个byte数据 void USART0_send_byte(uint8_t byte);// 发送多个byte数据 void USART0_send_data(uint8_t* data, uint32_t len);// 发送字符串 (结尾标记\0) void USART0_send_string(char *data); 接收回调定义 // 功能开关配置 #define USART0_RECV_CALLBACK 1#if USART0_RECV_CALLBACK // 收到串口0数据回调函数 extern void USART0_on_recv(uint8_t* data, uint32_t len); #endif ... #if USART0_RECV_CALLBACKUSART0_on_recv(g_rx_buffer, g_rx_cnt); #endif ... 通过宏定义做开关 系统printf打印定义 #define USART0_PRINTF 1#if USART0_PRINTF #include stdio.h #endif #if USART0_PRINTF // 配置printf打印函数 int fputc(int ch, FILE *f) {USART0_send_byte(ch);return ch; } #endif 完整代码 #ifndef __USART0_H__ #define __USART0_H__#include gd32f4xx.h// 功能开关配置 #define USART0_RECV_CALLBACK 1 #define USART0_PRINTF 1#if USART0_PRINTF #include stdio.h #endifvoid USART0_init(void);// 发送1个byte数据 void USART0_send_byte(uint8_t byte);// 发送多个byte数据 void USART0_send_data(uint8_t* data, uint32_t len);// 发送字符串 (结尾标记\0) void USART0_send_string(char *data);#if USART0_RECV_CALLBACK // 收到串口0数据回调函数 extern void USART0_on_recv(uint8_t* data, uint32_t len); #endif#endif #include USART0.h #include stdio.hvoid USART0_init(void) {// GPIO 初始化 ----------------------------------------------------// 启用GPIO时钟rcu_periph_clock_enable(RCU_GPIOA);/* 配置TX PA9和RX PA10引脚 */gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_9);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_10);gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);/* configure the USART0 TX pin and USART0 RX pin */gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);// 串口 初始化 ----------------------------------------------------// 启用USART0时钟rcu_periph_clock_enable(RCU_USART0);// 重置可选usart_deinit(USART0);// 配置串口参数波特率*, 数据位校验位停止位, 大小端模式usart_baudrate_set(USART0, 115200UL); // 波特率必填usart_word_length_set(USART0, USART_WL_8BIT); // 数据位默认8bitusart_parity_config(USART0, USART_PM_NONE); // 校验位默认无校验usart_stop_bit_set(USART0, USART_STB_1BIT); // 停止位默认1bitusart_data_first_config(USART0, USART_MSBF_LSB);// 大小端模式默认小端// 启用发送功能usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);// 启用接收功能usart_receive_config(USART0, USART_RECEIVE_ENABLE);// 开启接收中断nvic_irq_enable(USART0_IRQn, 2, 2);// 启用RBNE中断读数据缓冲区不为空中断usart_interrupt_enable(USART0, USART_INT_RBNE);// 启用IDLE中断空闲中断usart_interrupt_enable(USART0, USART_INT_IDLE);// 启用USARTusart_enable(USART0); }// 发送1个byte数据 void USART0_send_byte(uint8_t byte){// 从USART0的TX发送一个字节出去usart_data_transmit(USART0, (uint8_t)byte);// 等待发送完成 (轮询等待发送数据缓冲区为空)while(RESET usart_flag_get(USART0, USART_FLAG_TBE)); }// 发送多个byte数据 void USART0_send_data(uint8_t* data, uint32_t len){// 满足1.data指针不为空 2.长度不为0while(data len--){USART0_send_byte(*data);data;} }// 发送字符串 (结尾标记\0) void USART0_send_string(char *data){// 满足1.data指针不为空 2. 数据不能是\0while(data *data){USART0_send_byte((uint8_t)*data);data;} }#if USART0_PRINTF // 配置printf打印函数 int fputc(int ch, FILE *f) {USART0_send_byte(ch);return ch; } #endif/************************************ 中断函数收到标记信号马上执行 1. 触发中断函数的原因标记有很多 2. 需要区分是哪个标记触发的中断 RBNE: read data buffer not empty中断函数名不能随便写要根据中断向量表复制 *************************************/#define RX_BUFFER_LEN 1024 uint8_t g_rx_buffer[RX_BUFFER_LEN]; uint32_t g_rx_cnt 0;void USART0_IRQHandler(void){if(SET usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){// 收到数据 // printf(RBNE\n);// 清理标记(避免多次触发中断)usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE);// 获取寄存器里的数据uint8_t data usart_data_receive(USART0);// 缓存到buffer中g_rx_buffer[g_rx_cnt] data;// 避免缓冲区溢出 (可选)if(g_rx_cnt RX_BUFFER_LEN) g_rx_cnt 0;// 原样返回 send_byte(data);}if(SET usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)){ // printf(IDLE\n); // 空闲// 清理标记(无效) usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);// 只能使用以下方式清理IDLE标记usart_data_receive(USART0); // 必须读取一次USART0读到的结果没有用// 添加字符串结束标记避免打印出错g_rx_buffer[g_rx_cnt] \0;#if USART0_RECV_CALLBACK // printf(%s, g_rx_buffer);USART0_on_recv(g_rx_buffer, g_rx_cnt); #endif// 把缓冲区[0, g_rx_cnt)设置为0x00 可选 // memset(g_rx_buffer, 0x00, g_rx_cnt);// 重置缓冲区数据个数g_rx_cnt 0;} }总结 通过本文的学习我们深入探讨了如何使用文件系统中的库目录和keil工程中的分组管理库来实现串口功能的封装和抽取。通过编写中间件逻辑和定义相关接口我们实现了串口初始化、发送数据以及接收数据的功能并通过宏定义的开关配置来实现功能的灵活控制。同时我们也介绍了如何配置printf打印函数以及处理串口中断的相关操作。
http://www.hkea.cn/news/14375004/

相关文章:

  • 专业网站建设团队网站模板织梦免费
  • 怎么劝客户做网站关键词分析工具
  • 设计师 个人网站安卓app下载平台
  • 怎样黑网站效果图哪里可以制作
  • mg线上注册关键词优化排名用哪些软件比较好
  • 阅读的网站建设需要多少钱学前教育网站建设
  • 网站建设网页设计做网站wordpress替换谷歌字体
  • 网站建设企业合作邀请函google优化师
  • 电商网站建设图片有高并发,高访问量网站开发
  • 自己动手建立网站3有关网站开发的创意
  • 个人网站域名后缀做企业网站需要提供什么
  • 惠州网站优化建设网站模板免费下载网页模板
  • 宿州做企业网站进口网站建设
  • 青海省建设厅官方网站建设云建设银行安全网站
  • 行业网站建设蓝云网站怎么做英语和中文的
  • asp做的网站亚丝娜娜本子全彩办公网新闻上传网站开发
  • 影楼网站服务iis ip访问网站
  • 成都科技网站建设咨询电话好的平面设计灵感网站
  • 去哪里找做网站的有什么做ppt的网站
  • 一般公路建设招投标在什么网站上网络舆情应急预案
  • 做网站要交百分七十定金wordpress批量倒入txt
  • 网站开发步骤说明书是什么建设通是正规网站吗
  • 建设网站细节电子商务平台如何推广营销
  • 手机网站模板 html5 下载工具网站建站网站看看
  • WordPress瀑布流图片站网站广告下悬浮代码怎么做
  • 开饰品店网站建设预算自己开发app怎么赚钱
  • 网站如何做定级备案北京计算机培训学校
  • 网站设计网站建设网站制作北京 好的网站制作
  • 罗湖网站建设联系电话建网站广州
  • 网站视频嵌入代码室内设计图片大全