删除消息队列

需求 编程调试的时候,如果用到了消息队列,难免会消息队列中有残余信息的情况,并且如果希望在服务程序结束前就清除这些消息队列,那就需要在 shell 中使用命令进行删除。 解决 消息队列属于 IPC 的一部分,使用的命令也是 IPC 的系列命令中的 ipcrm. 查看消息队列情况 ipcs -q 删除指定 key 的消息队列,一般我们经常用这个,因为 key 一般是我们自己设定的。 ipcrm -Q 1234 删除指定 id 的消息队列 ipcrm -q 1234 如果程序是使用 sudo 来启动的,那么删除的时候,也需要 sudo, 否则没有权限. 参考 ipcs, ipcrm 命令 linux下消息队列的查看与删除(ipcs&ipcrm的使用) 请问Linux下如何清除消息队列queue中的内容??

2023-04-04 · 1 min · 39 words · RamLife

修改消息队列的大小

需求 因为需要在多个进程之间通过消息队列传输数据,所以需要加大消息队列的大小。 解决 首先确定使用的是 System V 还是 POSIX 的消息队列,这两种从 API 到配置都不一样。本文主要提的是 System V 的消息队列。 System V 查看当前系统中的设置 cat /proc/sys/kernel/msgmni cat /proc/sys/kernel/msgmax cat /proc/sys/kernel/msgmnb # 查看当前使用 ipcs -u # 查看限制 ipcs -l 修改配置 System V 的消息队列配置文件是 /etc/sysctl.conf 这个总的配置文件或者 /etc/sysctl.d/ 文件夹下面的细分配置文件。 sudo vim /etc/sysctl.d/11-message-queue.conf # set message queue # set message number of any queue kernel.msgmni = 312 # set one message max size kernel.msgmax = 8192 # set all message totall max size kernel....

2023-03-23 · 1 min · 129 words · RamLife

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

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

2023-03-21 · 1 min · 18 words · 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

2023-03-15 · 1 min · 60 words · 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....

2023-03-14 · 8 min · 1570 words · RamLife

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

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

2023-03-13 · 1 min · 12 words · RamLife

crosses initialization of XXX

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

2023-03-13 · 1 min · 25 words · RamLife

Linux 串口的配置和读写

需求 需要在 linux 中配置好串口,并且通过串口收发数据 解决 打开串口 打开串口直接使用 open 函数即可,需要注意的是, flag 中的参数 O_NOCTTY, O_NDELAY. O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这个标志的话,任何输入都会影响你的程序。 O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。但是在 man 中,是把 O_NDELAY 和 O_NONBLOCK 放在一起,并没有说明两者的区别,所以这这个参数的作用存疑。 open 时需要指定串口的串口号,比如 /dev/ttyS0 int OpenDevice(const char * dev) { int fd = 0; fd = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { fprintf(stderr, "Can not open serial port %s", dev); return -1; } cout << "open " << dev << " Ok!" << endl; return fd; } if ((serial_fd = OpenDevice(kSerialName....

2023-03-13 · 4 min · 782 words · RamLife

命令行调试串口

需求 在编程使用串口之前,希望先确定串口硬件和系统层面是否正常。 解决 可以使用 stty 来调试串口功能。 查询当前串口配置 sudo stty -aF /dev/ttyS0 上面这个命令可以打印出当前串口的所有配置,有些配置选项前面有 -, 这个表示关闭此选项,或者额外意义,具体可以参考手册 man stty. 需要注意这几个配置: speed, -parenb, cs8, -cstopb, -ixon, -ixoff, -echo. 表示: 波特率,关闭校验,8位,1位停止,无流控,无回显. 保存,读取当前配置 在进行串口配置之前,应该先保存现在配置,便于以后的恢复。 # 保存 sudo stty -gF /dev/ttyS0 > save_stty # 读取 sudo stty -F /dev/ttyS0 $(cat save_stty) 脚本中可以这样写: save_stty="$(stty -g)" ... stty $save_stty 配置串口 sudo stty -F /dev/ttyS0 speed 115200 cs8 -parenb -cstopb -ixon -echo 上面这条命令立即生效,即使已经使用 cat 读取串口数据。 读取数据 sudo cat /dev/ttyS0 *注意: *...

2023-03-09 · 1 min · 106 words · RamLife

gn 和 ninja 编译 hello world

需求 在 gn, ninja 的开发环境下,实现 hello world 的编译,用以摸清最简单用法。 解决 gn 文件准备 gn 相关的文件可以从 simple_build 这个例子里面复制,总共需要复制以下几个文件: .gn 这个文件是隐藏文件,很容易漏掉,并且是 gn 执行时最先寻找的文件。这个文件所在的位置就是项目源码的 root 位置。其中的内容就是简单的指定项目的构建 config 具体是那一个。例子中指定的是 build/BUILDCONFIG.gn. build/BUILDCONFIG.gn, build/BUILD.gn 这两个是针对项目的一些设置包括不同操作系统的设置。 build/toolchain/BUILD.gn 这个是针对工具链的一些设置。 BUILD.gn 这个才是我们一般进行配置的文件,主要是配置需要编译的文件,库,最终的可执行文件等等。注意,不能使用 tab, 只能使用 space. 编译 使用 gn 生成 ninja 编译脚本。下面这条命令会在 out 目录下生成 test 目录,并且生成的 ninja 脚本也放在这个文件夹里面。 gn gen out/test 使用 ninja 正式编译。生成的编译文件和最终文件都放在相应的文件夹里面。 ninja -C out/test/ 运行和查看 直接运行 out/test 目录下的 hello 就可以执行了。 可以使用 gn desc 来查看相关信息. gn desc out/test "//:hello" 参考 GN使用笔记...

2023-03-08 · 1 min · 90 words · RamLife