Android Studio 如何单元测试

需求 编写注册资料中,需要写关于单元测试相关的资料,所以需要使用 android studio 来进行单元测试. 解决 android 单元测试分为两种: 本地测试,在 test 文件夹,只涉及 java 本身,可以用 jvm 来进行测试的。 仪器测试,在 androidTest 文件夹,涉及到 android 框架,或者其他特殊情况等等。 本地测试 本地测试很简单,在源码中需要测试的方法上,右键 -> generate -> test,就可以弹出创建 test 的窗口,根据自己需要进行勾选,然后点击 ok 即可。如果已经存在测试代码文件了,还会提示你更新。 在测试代码中,主要依靠各种 assert 来判断是否满足条件,满足就通过,不满足就不通过。还有建议使用 import org.junit.Test; 而不是 import junit.framework.TestCase; assertTrue assertFalse assertEquals 注意在比较浮点数时,最好使用带 delta 参数的方法。 assertNotNull assertNull assertSame 判断是否是同一个引用 assertNotSame 在测试代码的方法或者类左侧有 run 的图标,点击可以选择是否在测试的时候计算覆盖率。 另外,setUp 可以用来做测试前的准备,tearDown 可以用来做测试后的首尾。 仪器测试 参考 编写你的第一个 Android 单元测试 Android 单元测试,从小白到入门开始 在AndroidStudio中使用单元测试 Android 单元测试只看这一篇就够了 构建有效的单元测试 构建插桩单元测试 构建本地单元测试 在 Android Studio 中测试...

2023-06-03 · 1 min · 83 words · RamLife

rs485 保护电路

需求 rs485 上下拉电阻选择 解决 隔离: 光耦 旁路: tvs 上下拉电阻 终端匹配电阻 参考 几种实现485隔离的方案 终于讲透了,史上最详细的RS485串口通讯! RS485硬件标准1-电平定义 详解RS-485上下拉电阻的选择

2023-06-01 · 1 min · 15 words · RamLife

printf 打印指针类型

需求 在 32位 和 64位的平台上,指针类型占用的字节数不一样,使用 %d 直接打印指针对应的地址老是提示类型不对,有没有什么好方法呢? 解决 printf 其实专门有一个和指针类型对应的占位符,就是 %p. 参考 C学习:%p和%x、%lx、%hx、%llx区别辨析

2023-05-27 · 1 min · 13 words · RamLife

QT dialog 关闭时释放资源

需求 需要在 QDialog 关闭的时候,自动释放掉资源。 解决 默认情况下, QDialog 占用的内存会在 MainWindow 关闭后释放,如果想要在 QDialog 本身关闭的时候就释放,需要通过 setAttribute 方法配置 Qt::WA_DeleteOnClose 选项. CurrentGetConfigForm * current_get_config_form = nullptr; void MainWindow::on_pushButton_current_get_config_clicked() { if (!GetConfig()) return; if (current_get_config_form == nullptr) current_get_config_form = new CurrentGetConfigForm(nullptr, port_, version_, address_); current_get_config_form->setAttribute(Qt::WA_ShowModal, true); current_get_config_form->setAttribute(Qt::WA_DeleteOnClose, true); current_get_config_form->show(); //QEventLoop loop; //loop.exec(); qDebug() << "MainWindow::on_pushButton_current_get_config_clicked() end" << Qt::endl; current_get_config_form = nullptr; } 参考 Qt Dialog 内存管理问题:Dialog关闭时会自己释放自己吗?

2023-05-25 · 1 min · 60 words · RamLife

QT widget 以阻塞的模态形式打开

需求 需要把 widget 以模态形式打开,组织用户操作前一个页面。 解决 QWidget 没有 exec 这个方法,只能转化为 QDialog 之后,再使用 exec 方法。 CurrentGetConfigForm * current_get_config_form = nullptr; void MainWindow::on_pushButton_current_get_config_clicked() { if (!GetConfig()) return; if (current_get_config_form == nullptr) current_get_config_form = new CurrentGetConfigForm(nullptr, port_, version_, address_); current_get_config_form->setAttribute(Qt::WA_ShowModal, true); current_get_config_form->setAttribute(Qt::WA_DeleteOnClose, true); current_get_config_form->show(); //QEventLoop loop; //loop.exec(); qDebug() << "MainWindow::on_pushButton_current_get_config_clicked() end" << Qt::endl; current_get_config_form = nullptr; } 参考 QWidget如何exec QT 创建新窗口并且实现页面跳转 qt 增加新窗口,并显示在最前

2023-05-25 · 1 min · 59 words · RamLife

memcpy 和 memmove 区别

需求 正常我们直接复制内存使用的是 mcmcpy, 今天看到 memmove 感到比较奇怪,他们的区别是什么? 解决 相同点 memcpy 和 memmove 都是内存复制。当目的内存和源内存没有交集的情况下,随便使用哪个都可以。 不同点 当目的内存和源内存有交集的时候,因为 memcpy 是从前向后复制的,所以会造成部分内容出错。而 memmove 会先判断,如果有交集,那么就从后向前复制。 注意 现在有些系统,在实现的时候, memcpy 和 memmove 是等价的,所以可以直接用 memmove. 当效率要求不高的时候,可以统一使用 memmove, 当效率要求比较高的时候,在程序中无交集情况下,使用 memcpy, 有交集情况下使用 memmove. 参考 详解memcpy和memmove函数的使用

2023-05-25 · 1 min · 33 words · RamLife

stm32 cube ide 打印开启浮点数支持

需求 在使用 stm32 cube ide 开发的时候,调试时希望使用 sprintf, printf 等 通过 %f 打印浮点数,需要开启 ide 相关支持. 解决 开启 浮点数支持, =project –> properties –> c/c++ build –> setting –> tools setting –> mcu setting –> use float with printf from newlib-nano(-u_printf_float)= 参考 C语言用printf读取和输出double类型

2023-05-24 · 1 min · 40 words · RamLife

stm32 串口帧空闲中断接收大量数据

需求 串口使用普通的接收中断 HAL_UART_Receive_IT 在接收比较少的字节,并且中断处理非常简单的情况下还行,一旦需要接收大量的数据,并且中断处理稍微复杂一些,就会造成丢数据的情况。需要解决这个情况。 解决 解决的办法就是使用帧空闲中断 HAL_UARTEx_ReceiveToIdle_IT 来接收一大堆数据,配套的 callback 函数是 HAL_UARTEx_RxEventCallback. void MainInit() { HAL_UARTEx_ReceiveToIdle_IT(&huart2, uart_web.get_rx_buf(), UartWeb::kRxBufLength); } void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) { if (huart->Instance == USART2) { LOGD("HAL_UARTEx_RxEventCallback: USART2"); if (uart_web.Receive(Size)) { main_status = kMainWebReceive; } //HAL_UART_Receive_IT(&huart2, &uart_web_tmp, 1); HAL_UARTEx_ReceiveToIdle_IT(&huart2, uart_web.get_rx_buf(), UartWeb::kRxBufLength); } } 参考 stm32 HAL库 笔记——HAL_UARTEx_ReceiveToIdle_IT STM32 非阻塞HAL_UART_Receive_IT解析与实际应用 【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解 STM32CubeMX——串口数据收发基础(HAL 库)

2023-05-24 · 1 min · 56 words · RamLife

stm32 使用 flash 保存数据

需求 需要使用 stm32 内置的 flash 来保存数据. 解决 最快的方法就是参考官方例程,默认是在用户目录下面的 STM32Cube/Repository, 可以参考这个的例子去写。基本就分为 擦除,写入,读取 这三块。 注意: 擦除和写入都需要先 unlock, 操作完成之后,再 lock 一下。 注意: 需要更加手册确定好使用芯片的 flash sector 的排布,修改相关的宏定义,才能正常的操作。 参考 STM32 HAL库手册获取和查阅方法以及查看官方例程 STM32用HAL库写内部FLASH 【STM32+cubemx】0015 HAL库开发:内部flash读写 STM32系列(HAL库)——内部FLASH读写实验 STM32系列(HAL库)——内部FLASH读写实验_简约版 STM32 实现内部Flash的读写(HAL库版)

2023-05-24 · 1 min · 33 words · RamLife

stm32 在其他中断中使用 HAL_Delay

需求 因为 485 总线控制的时候,需要考虑在收发转换的时候,不能直接切换,应该让状态再保持一段时间,比如 2ms ,然后再进行切换,这样通讯会更加稳定。这就需要再收发中断里面使用延时,而最简单的延时就是 systick 的延时。但是实际上使用起来,这个延时工作不正常。 解决 出问题的原因也很简单,因为 st 默认让 systick 的中断优先级是最低,所以导致在其他中断中,使用 HAL_Delay, 内部的数值不变,所以一直困在中断里面。解决的方法也很简单,就是重新配置中断优先级,把 systick 的优先级提高到高于通信中断的优先级即可。 参考

2023-05-24 · 1 min · 19 words · RamLife