matplot 多个图片在多个窗口显示

需求 使用 matplot 时,当需要多于 10 个的图表显示,使用单窗口多子图的模式,会太小了,看不清楚。所以需要使用多窗口模式,每个窗口只显示有限的子图即可。 解决 其实很简单,只要保证只有一个 show 即可,把所有的窗口全部设置好之后,在最后使用 show, 就可以多个窗口都显示出来了。 for i in range(0, channel_num): fig = plt.figure(num = i, figsize = (4, 4)) ax1 = fig.add_subplot(311) ax1.plot(lists[i][0]) ax2 = fig.add_subplot(312) ax2.plot(lists[i][1]) ax3 = fig.add_subplot(313) ax3.plot(lists[i][2]) #plt.show() plt.show() 参考 Python 多个图同时在不同窗口显示

<span title='2023-03-21 15:54:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;43 words&nbsp;·&nbsp;RamLife

gdb 调试崩溃产生的 core 文件

需求 程序崩溃后,希望知道程序到底是因为什么崩溃的,首先需要找到崩溃后的 core 文件,然后调试加载 core 文件。 解决 先在软件的目录寻找 core 文件,如果没有按照下面的步骤来处理。 确认开启了 core 查看当前允许的 core 文件的最大大小。 ulimit -c 设定固定值或者不限制, 单位是 KB ulimit -c 1024 ulimit -c unlimited 确认 core 文件路径 如果文件路径类似下面这样的,就说明 core 被系统转存了,需要专门导出 cat /proc/sys/kernel/core_pattern |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h %e 导出 core 导出需要使用 coredumpctl, 如果没有安装,使用如下命令: sudo apt install systemd-coredump 使用 coredumpctl, 查看崩溃的 pid, 如果显示的不完整,可以使用方向键来查看未完信息。 如果崩溃的 pid 为 1234, 并且导出的文件名为 core_2023 coredumpctl -o core_2023 dump 1234 加载 core 如果可执行文件名为 main, 崩溃文件为 core_2023....

<span title='2023-03-21 15:43:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;88 words&nbsp;·&nbsp;RamLife

gdb list 显示指定文件或函数

需求 当多个文件编译后,需求调试的时候,需要 b 来打断点,但是前提是通过 list 翻到代码所在行。默认的 list 每次的行数太少,而且也不是一下子就能翻到。 解决 指定文件 可以直接指定源文件的某一行进行 list. 比如需要查看 a.cpp 的 100行。 gdb> list a.cpp:100 指定函数 可以直接指定查看某个函数,比如查看 Pack 这个函数。 gdb> list Pack 参考 gdb中list用法 GDB单步调试程序

<span title='2023-03-21 15:20:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;29 words&nbsp;·&nbsp;RamLife

录屏软件简单使用

需求 想要把腾讯会议的培训教程录制下来,以后可以观看,又不希望通知其他与会者。 解决 使用 obs 这款软件就可以。 下载 使用 https://obsproject.com/ 这个网站,就可以下载了。 注意:这个是英文网站,下载免费。中文网站,下载收费 设置 在录制前,去设置中修改保存的位置,保证文件夹有足够的空间。 录制桌面 在左下第二个格, source 的左下角,点击 +, 选择 Display Capture, 就可以录制全桌面了。 Audio Mixer 里面是选择录制的音频 点击最右边的 start recording 即可开始录制。 注意:桌面上有啥,录制啥,所以如果这样录制的话,需要全程让腾讯会议在最前才可以 录制窗口 打开腾讯会议并且进入会议或者其他你想录制的软件,并且窗口最大化。 在 source 中新建选择 Window Capture, 就可以选择一个窗口进行录制。 保证 Audio Mixer 是 Desktop Audio, 并且最大。 把系统声音拉到最大。 点击 start recording 开始录制 可以点击系统声音最前面的静音图标,这样就不会影响办公。而且也不会影响到录制的声音。 打开其他你需要工作的软件即可做其他工作。 注意:一定要注意,千万千万不要把需要录制的腾讯会议的窗口给最小化了,否则就不能录制了。可以打开其他软件遮盖,但就是不能最小化 参考 OBS录屏安装与简单使用方法 在腾讯会议运行期间录屏,会被后台检测并发送警告给会议组织者?

<span title='2023-03-21 14:56:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;56 words&nbsp;·&nbsp;RamLife

多维列表添加值时,多个位置被同时修改的错误

需求 今天使用 python 编写一个数据处理的脚本时,结果怎么都不对。经过反复调试,问题出现在使用 append 给多维列表添加值的时候,我需要的是只在指定的列表里面添加,结果多维列表的内部多个列表同时被添加值了。 解决 原因 这个错误有点莫名其妙,一开始我以为是我写错了,导致类似于 numpy 里面那样,对多维数组操作时,对高维操作时,会有多个地方被修改。 但是在自己检查之后发现,并不是这种情况。后来经过反复的调试和搜索后,终于确定原因所在。 原因其实还是在新建多维列表的地方,如下是我开始时候的写法: c1 = [] c2 = [] t = [] for i in range(0, 12): l = [c1, c2, t] out_data.append(l) 上面的写法看起来却是是新建了 12 * 3 的多维列表,但是隐藏的问题是,这样添加,其实添加的是 c1, c2, t 的引用,所以导致只要有一个变化了,其他的都会跟着变。 解决 只要修改创建多维列表的方法就可以了,比如这样: out_data = [ [ [] for j in range(3) ] for i in range(channel_num) ] 参考 Python 创建多维空列表 python初始化二维列表:{}.append({}) 与 {{}} * n python 二维列表(数组)赋值问题 python二维列表List修改其中一个数值,所有项数值都改变的问题。

<span title='2023-03-21 14:14:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;70 words&nbsp;·&nbsp;RamLife

串口读取数据部分数据有错误

需求 在使用串口调试助手调试读写程序时,发现在开启定时 10ms 发送的情况下,接收到的数据有时候会不对。 解决 原因 经过反复调试,最终确定问题是 RS485 导致的问题。因为下面几个原因叠加导致: RS485 是半双工设备,同时只能收或者发。 串口调试助手,定时发送没有办法刚好完全避开程序的发送 所以,就出现了,当程序在发送时,串口调试助手也在发送,等到程序接收的时候,数据就不完整,或者有问题。 验证 验证也很简单: 程序只收不发,然后查看所有受到的数据,没有错误。 程序发送的间隔拉的很长,观察在发送间隔中的接收数据,也是没有错误的。 参考

<span title='2023-03-21 13:46:00 +0800 CST'>2023-03-21</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;18 words&nbsp;·&nbsp;RamLife

gn 使用细节

需求 在项目中使用 gn 时,会有很多各种各样的构建需求,本文是记录这些细节的实现方法。 解决 静态库 需求: 项目文件夹为 project, 静态库源文件目录为 project/protocol 静态库源文件分为两个文件, a.cpp, b.cpp 静态库名为 proto 解决: 在静态库目录下新建 BUILD.gn, 内容如下: static_library("proto") { sources = [ "a.cpp", "b.cpp", ] } 注意: 库名称 在项目目录下的 BUILD.gn, 新增内容如下: executable("test") { ... deps = [ "//protocol:proto", ] ... } *注意: 冒号前面是文件夹路径,冒号后面是 BUILD.gn 文件中的标识, 如果标识和文件夹名称一致,可以省略冒号及后面的部分。比如,文件夹是 abc, 生成的库也是 abc, 那么依赖这个地方可以直接写成 //abc 即可 * 参考 using gn build

<span title='2023-03-15 14:34:00 +0800 CST'>2023-03-15</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;60 words&nbsp;·&nbsp;RamLife

Linux 键盘输入读取

需求 读取二维码 DataMatrix 格式的扫码头是 usb 接口,通过键盘输入的形式输出数据。程序需要读取这些数据。 解决 设备信息 获取设备信息 键盘输入在 linux 当中属于 input 子系统,对应的设备号是 /dev/input/eventX, 如果希望知道自己的设备具体对应那个,可以使用下面这条命令来获取所有的输入设备信息。如果希望了解输入的更多内容,可以查看 https://www.kernel.org/doc/Documentation/input/input.txt cat /proc/bus/input/devices I: Bus=0019 Vendor=2454 Product=6575 Version=0010 N: Name="mtk-kpd" P: Phys= S: Sysfs=/devices/platform/mtk-kpd/input/input0 U: Uniq= H: Handlers=event0 B: PROP=0 B: EV=3 B: KEY=1c0000 0 0 0 I: Bus=0019 Vendor=0000 Product=0000 Version=0000 N: Name="ACCDET" P: Phys= S: Sysfs=/devices/virtual/input/input1 U: Uniq= H: Handlers=event1 B: PROP=0 B: EV=3 B: KEY=80 0 78 0 40c0000 0 0 0 I: Bus=0000 Vendor=0000 Product=0000 Version=0000 N: Name="hwmdata" P: Phys= S: Sysfs=/devices/virtual/input/input2 U: Uniq= H: Handlers=event2 B: PROP=0 B: EV=5 B: REL=2 分析设备信息 根据上面的输出信息,可以根据 Name 这一行大概找到自己的设备,如果希望知道设备支持的详细内容可以查看 EV 值,根据 /usr/include/linux/input-event-codes....

<span title='2023-03-14 11:46:00 +0800 CST'>2023-03-14</span>&nbsp;·&nbsp;8 min&nbsp;·&nbsp;1570 words&nbsp;·&nbsp;RamLife

多进程如何使用单串口的方案

需求 数据处理的程序是多进程的,那么如何让多进程的处理程序使用硬件上的单个的串口呢? 解决 最适合的方法还是,把串口部分的程序独立出来,做成一个服务程序。 这个服务,对下是一条一条的把数据帧通过硬件串口进行收发。 这个服务,自身需要对数据进行一定的加工处理,比如按照指定的协议对数据帧进行编解码。 这个服务,对上可以使用队列,管道等进程间通讯的方式,把相关数据送到不同的进程中去。 当然如果多进程的处理功能特别简单,也可以考虑把这个处理的功能和串口二合一,然后通过多线程的方式去做。 参考 这个很有必要讨论讨论,我搞过一小段时间售货机,串口通信 多个进程间如何实现串口控制共享 linux两个进程同时打开串口,linux串口操作及设置详解

<span title='2023-03-13 15:01:00 +0800 CST'>2023-03-13</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;12 words&nbsp;·&nbsp;RamLife

crosses initialization of XXX

需求 今天修改了几行程序后,编译不通过,报错为 crosses initialization of. 解决 经过搜索和尝试,发现是 goto 语句引起的,但是也不单纯是 goto 引起的。主要是同时达到了下面两个条件。 变量定义并没有都放在函数的开始。 使用 goto 的语句下面,还有新定义的变量。 所以,编译器担心 goto 跳过这些新定义的变量可能导致程序执行的结果有问题,就报错了。解决也很简单,把使用 goto 语句下面新定义的变量移动到上面就可以了。 参考 goto语句引起的crosses initialization of XXX

<span title='2023-03-13 14:36:00 +0800 CST'>2023-03-13</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;25 words&nbsp;·&nbsp;RamLife