第五周周记


一、简介

1、Bootstrap 包的内容

  • 基本结构:Bootstrap 提供了一个带有网格系统、链接样式、背景的基本结构。这将在 Bootstrap 基本结构 部分详细讲解。

  • CSS:Bootstrap 自带以下特性:全局的 CSS 设置、定义基本的 HTML 元素样式、可扩展的 class,以及一个先进的网格系统。这将在 Bootstrap CSS 部分详细讲解。

  • 组件:Bootstrap 包含了十几个可重用的组件,用于创建图像、下拉菜单、导航、警告框、弹出框等等。这将在 布局组件 部分详细讲解。

  • JavaScript 插件:Bootstrap 包含了十几个自定义的 jQuery 插件。您可以直接包含所有的插件,也可以逐个包含这些插件。这将在 Bootstrap 插件 部分详细讲解。

  • 定制:您可以定制 Bootstrap 的组件、LESS 变量和 jQuery 插件来得到您自己的版本。

二、Bootstrap 样式

1、表格

<table>为表格添加基础样式。
<thead>表格标题行的容器元素(<tr>),用来标识表格列。
<tbody>表格主体中的表格行的容器元素(<tr>)。
<tr>一组出现在单行上的表格单元格的容器元素(<td><th>)。
<td>默认的表格单元格。
<th>特殊的表格单元格,用来标识列或行(取决于范围和位置)。必须在 <thead> 内使用。
<caption>关于表格存储内容的描述或总结。

2、按钮

一共有十四种按钮类型,

.btn为按钮添加基本样式
.btn-default默认/标准按钮
.btn-primary原始按钮样式(未被操作)
.btn-success表示成功的动作
.btn-info该样式可用于要弹出信息的按钮
.btn-warning表示需要谨慎操作的按钮
.btn-danger表示一个危险动作的按钮操作
.btn-link让按钮看起来像个链接 (仍然保留按钮行为)
.btn-lg制作一个大按钮
.btn-sm制作一个小按钮
.btn-xs制作一个超小按钮
.btn-block块级按钮(拉伸至父元素100%的宽度)
.active按钮被点击
.disabled禁用按钮

3、图片

.img-rounded为图片添加圆角 (IE8 不支持)
.img-circle将图片变为圆形 (IE8 不支持)
.img-thumbnail缩略图功能
.img-responsive图片响应式 (将很好地扩展到父元素)

二、BootStrap组件和插件

1、导航栏

导航栏是一个很好的功能,是 Bootstrap 网站的一个突出特点。导航栏在您的应用或网站中作为导航页头的响应式基础组件。导航栏在移动设备的视图中是折叠的,随着可用视口宽度的增加,导航栏也会水平展开。在 Bootstrap 导航栏的核心中,导航栏包括了站点名称和基本的导航定义样式。

创建一个默认的导航栏的步骤如下:
<nav> 标签添加 class .navbar、.navbar-default。
向上面的元素添加 role=“navigation”,有助于增加可访问性。
<div> 元素添加一个标题 class .navbar-header,内部包含了带有 class navbar-brand 的 <a> 元素。这会让文本看起来更大一号。
为了向导航栏添加链接,只需要简单地添加带有 class .nav、.navbar-nav 的无序列表即可。

2、页面标题

页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距。当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用。

3、列表组

列表组件用于以列表形式呈现复杂的和自定义的内容。

4、多媒体对象

多媒体对象的样式可用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐。媒体对象可以用更少的代码来实现媒体对象与文字的混排。


在嵌入式开发实习的第十八,可以从多个维度对工作内容进行总结,包括项目进展、技术挑战、文档整理以及个人成长等方面。 ### 项目进展 本主要完成了某个嵌入式项目的初步版本交付。该项目涉及基于 Modbus 协议的串口通信功能开发,通过硬件团队的紧密合作,确保了软件部分硬件设备之间的数据交互正常运行。此外,还完成了上位机软件的数据对接,实现了数据的实时监控和调试功能[^1]。 ### 技术挑战 在开发过程中,遇到了一些技术难题。例如,在处理 Modbus 协议时,需要理解其通信机制和数据格式,以确保数据的正确解析和发送。为了提高系统的稳定性,采用了自旋锁(spinlock)来保护共享资源,防止并发访问导致的数据不一致问题[^4]。同时,针对 UART 通信中的数据校验问题,引入了奇偶校验和CRC校验机制,确保了数据传输的可靠性[^3]。 ### 文档整理 为了便于后续的维护和团队协作,本还重点进行了开发文档的整理工作。文档内容涵盖了项目的需求分析、架构设计、模块划分、接口定义以及测试用例等。通过详细的文档记录,不仅提高了项目的可追溯性,也为新成员的加入提供了良好的参考资料[^1]。 ### 个人成长 通过这一的工作,不仅加深了对嵌入式开发的理解,还在实践中掌握了更多的技术细节。特别是在处理复杂协议和多线程编程方面有了显著的进步。此外,还学会了如何高效地进行问题排查和调试,提升了实际解决问题的能力。面对技术上的挑战,保持持续学习的态度,积极查阅资料并向经验丰富的同事请教,使得问题得以顺利解决[^2]。 ### 代码示例 以下是一个简单的 Modbus 协议解析示例,展示了如何从串口读取数据并解析为 Modbus 报文: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> // Modbus 报文结构体 typedef struct { uint8_t slave_id; uint8_t function_code; uint16_t starting_address; uint16_t quantity_of_registers; uint8_t byte_count; uint16_t *registers; } ModbusRequest; // 解析 Modbus 请求报文 int parse_modbus_request(const uint8_t *buffer, size_t length, ModbusRequest *request) { if (length < 8) { return -1; // 数据长度不足 } request->slave_id = buffer[0]; request->function_code = buffer[1]; request->starting_address = (buffer[2] << 8) | buffer[3]; request->quantity_of_registers = (buffer[4] << 8) | buffer[5]; request->byte_count = buffer[6]; if (request->byte_count != (buffer[7] * 2)) { return -2; // 数据长度不匹配 } request->registers = (uint16_t *)malloc(request->byte_count); if (!request->registers) { return -3; // 内存分配失败 } for (int i = 0; i < request->byte_count / 2; i++) { request->registers[i] = (buffer[7 + i * 2] << 8) | buffer[8 + i * 2]; } return 0; } int main() { int fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { perror("无法打开串口"); return 1; } struct termios tty; memset(&tty, 0, sizeof tty); if (tcgetattr(fd, &tty) != 0) { perror("获取串口属性失败"); return 1; } cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars tty.c_iflag &= ~IGNBRK; // disable break processing tty.c_lflag = 0; // no signaling chars, no echo, no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 10; // 0.5 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD); // ignore modem controls, enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag &= ~CSTOPB; // only need 1 stop bit tty.c_cflag &= ~CRTSCTS; // no hardware flowcontrol if (tcsetattr(fd, TCSANOW, &tty) != 0) { perror("设置串口属性失败"); return 1; } uint8_t buffer[256]; ssize_t n = read(fd, buffer, sizeof(buffer)); if (n > 0) { ModbusRequest request; int result = parse_modbus_request(buffer, n, &request); if (result == 0) { printf("从站ID: %d\n", request.slave_id); printf("功能码: %d\n", request.function_code); printf("起始地址: %d\n", request.starting_address); printf("寄存器数量: %d\n", request.quantity_of_registers); printf("数据长度: %d\n", request.byte_count); for (int i = 0; i < request.quantity_of_registers; i++) { printf("寄存器[%d]: %d\n", i, request.registers[i]); } free(request.registers); } else { printf("解析Modbus请求失败: %d\n", result); } } else { printf("没有读取到数据\n"); } close(fd); return 0; } ``` ### 相关问题 1. 如何在嵌入式系统中实现Modbus协议的通信? 2. 在嵌入式开发中,如何处理多线程环境下的资源共享问题? 3. 如何编写高效的嵌入式驱动程序? 4. 嵌入式系统中常用的调试工具和技术有哪些? 5. 如何评估嵌入式系统的性能和稳定性?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值