通过shell脚本进行串口控制

2024-05-22

我正在开发一个方向控制器。我有一个开发板,它通过 I2C 与传感器(指南针)通信。由于主板非常有限(没有操作系统),我开发了一个简单的程序来接收以下内容:(1)“get 0”读取传感器的寄存器 0; (2)“set 0 10”将传感器的寄存器 0 设置为值 10。对于每种情况,板都会返回:(1)“完成:10”。 (寄存器 0 的值为 10); (2)“完成”。 (3) 发生错误时显示“错误:...”。为此,我尝试开发一个 shell 脚本(bash)来发送命令和检索数据,以便了解传感器并开发控制器。

我的问题是以下代码:

# read device output in the background.
head -n 1 /dev/ttyUSB0 &
head=$!

# (#1): without the following stmt I get:
#   head: cannot open `/dev/ttyUSB0' for reading: : Protocol error
sleep 0.1

# send command to the device.
echo "get 0" > /dev/ttyUSB0

# (#2) wait for head.
while kill -0 $head 2>/dev/null ; do : ; done

我猜(#1)是由“head”和“echo”之间的读/写冲突引起的,但我不知道为什么,也不知道如何解决它。

另一个问题是在(#2)中我想使用超时。我尝试过类似的事情:

timeout 1 bash -c "while kill -0 $head 2>/dev/null ; do : ; done"

但我得到:Timeout: aborting command ``bash'' with signal 9并且程序卡住了。

顺便说一下,在执行上面的代码之前,我使用以下命令初始化串行端口:

stty -F /dev/ttyUSB0 9600 cs8 -cstopb

编辑:我不需要交互式终端。我想根据需要使用这个例程。该例程是控制器(读/写传感器寄存器)的必要基础,稍后将在电路板上实现。


为了解决(#1)问题,我修改了例程以使用 fd:

# $1: the device filename, eg. /dev/ttyS0
# $2: number of lines to read before exit.

exec 3<>$1

head -n "$2" 0<&3 &
wait_pid=$!

cat - 1>&3

wait $wait_pid

exec 3>&-

EDIT:为了解决(#2)问题,我将责任委托给调用者,而不是为例程提供超时支持。但是,如果超时,我们需要进行清理。为此我在之后添加了以下内容wait_pid=$!:

trap="if kill -0 $wait_pid ; then kill -TERM $wait_pid ; fi"
trap "$trap" SIGINT SIGKILL SIGTERM
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过shell脚本进行串口控制 的相关文章

  • 如何重命名 bash 函数?

    我正在围绕另一个定义 bash 函数的软件包开发一些方便的包装器 我想用我自己的同名函数替换他们的 bash 函数 同时仍然能够从我的函数中运行他们的函数 换句话说 我需要重命名它们的函数 或者为其创建某种持久别名 当我创建同名函数时 该别
  • Docker exec linux 终端创建别名

    我有一个正在运行且独立的容器 我想在附加到该容器之前创建一个命令别名 当我连接到容器并输入 alias bar foo 创建别名 并可以通过以下方式检查 alias command 但如果我想做同样的事情码头执行者命令即这样 docker
  • wget 并行下载文件并重命名

    我有一个包含两列的文本文件 第一列是要保存的名称 第二列是资源的 url 地址 10000899567110806314 jpg http lifestyle inquirer net files 2018 07 t0724cheekee
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • Bash touch - 非法选项 -d

    昨天我拍了很多照片 但我忘记更改相机中的时区 现在所有图片的修改日期都有错误 我想将特定目录中所有文件的修改日期更改为minus 10 hours bin sh for i in Users slick Desktop 100D5200 d
  • 用于获取特定用户 ID 和进程数的 Bash 脚本

    我需要 bash 脚本来计算特定用户或所有用户的进程 我们可以输入 0 1 或更多参数 例如 myScript sh root deamon 应该像这样执行 root 92 deamon 8 2 users has total proces
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 命令中的 Bash 变量扩展[重复]

    这个问题在这里已经有答案了 DATE 1 week ago date date DATE 不起作用 我怎样才能让它发挥作用 我可以做 DATE CMD date date DATE eval DATE CMD 但我不想将整个命令存储在变量中
  • 通过 ssh 运行 Bash 脚本

    我正在尝试编写一个 Bash 脚本 它将通过 SSH 连接到计算机并创建一个目录 长期目标有点复杂 但现在我从简单的开始 然而 虽然很简单 但我似乎不太明白 这是我的代码 bin bash ssh T email protected cdn
  • Python实时读取串口数据

    我正在使用 Python 中的脚本通过串行端口以 2Mbps 的速度从 PIC 微控制器收集数据 PIC 在 2Mbps 下完美定时工作 FTDI USB 串行端口在 2Mbps 下工作也很好 均通过示波器验证 我每秒发送消息 大小约为 1
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • 如何在bash中进行二进制加法

    我正在尝试将两个 32 位二进制数相加 其中之一是常数 address range in binary 另一个是数组的元素 IPinEachSubnet val 我正在尝试按照说明进行操作here https www linuxquesti
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • 为什么 ?(*[[:class:]])foobar 的 Bash 模式匹配速度很慢?

    我有一个文本文件 foobar txt 大约 10KB 不是那么长 然而 以下匹配搜索命令在高性能 Linux 计算机上大约需要 10 秒 bash gt shopt s extglob bash gt cat foobar txt pri
  • 在 Bash 中从文本文件创建数组

    脚本采用 URL 解析它的所需字段 并将其输出重定向以保存在文件中 file txt 每次找到字段时 输出都会保存在新行中 file txt A Cat A Dog A Mouse etc 我要拿file txt并在新脚本中从中创建一个数组
  • 编写 shell 脚本以 am 或 pm 表示法显示时间

    我正在尝试编写一个 shell 脚本 以上午或下午的形式显示时间 而不是使用 date 命令显示时间 我不知道我应该如何去做这件事 我想对于初学者来说 如何从日期命令中提取时间来操作它 我如何提取小时数来操纵它 您正在寻找的是 man st
  • 管道安装时疏水阀是否按预期工作?

    以下是问题演示的最少代码 http pastebin com 5TXDpSh5 http pastebin com 5TXDpSh5 bin bash set e set o pipefail function echoTraps echo
  • bash - 检查特定列中的单词,检查该行其他列中的值,将该行剪切并粘贴到新文本文件中

    我的文本文件包含约 20k 行 如下所示 file A ATOM 624 SC1 SER 288 54 730 23 870 56 950 1 00 0 00 ATOM 3199 NC3 POP 487 50 780 27 750 27 5
  • 使用 awk 将特定子字符串与正则表达式匹配

    我正在处理特定的文件名 并且需要从中提取信息 文件名的结构类似于 20100613 M4 28007834 005 F RANDOMSTR raw gz RANDOMSTR 是最多 22 个字符的字符串 并且可能包含 或不包含 格式为 W
  • '>&0' 有用途吗(重定向到标准输入)?

    在 bash 中你可以这样做 echo test gt 1 重定向到标准输出 尽管它已经到那里了 echo test gt 2 重定向到标准错误 echo test gt 0 重定向到标准输入 当我做最后一个时 我的终端仍然打印test就像

随机推荐

  • 依赖于 pod 的 Swift 通用框架

    我正在开发一个依赖于 Alamofire 的小型 Swift 框架 我将它用作属于同一工作区的应用程序的嵌入式框架 并且它运行良好 当我想构建一个具有总体目标的通用框架时 问题就出现了 然后 当执行脚本生成框架时 它失败并显示消息No su
  • 如何安装 xCode 命令行工具?如何将 Xcode 9 beta 与 xCode 8 一起安装?

    工具可用吗 我有一个苹果开发者帐户 并且我下载了 Xcode 9 betahttps developer apple com download https developer apple com download Xcode 9 开发者工具
  • 为什么我的 UIPickerView 崩溃了?

    当我使用 UIPickerView 加载视图时出现以下错误 由于未捕获的异常 NSInvalidArgumentException 而终止应用程序 原因 NSCFNumber isEqualToString 无法识别的选择器发送到实例 0x
  • 使用 MySQL 的 CURDATE() 或 PHP 的 date() 更快?

    使用mysql查询是不是更快 SELECT CURDATE as today 或 PHP 语句 curdate date Y m d 同样的答案是否适用于使用date VS MySQL 的NOW and CURTIME 如果您只是执行查询以
  • COM多线程支持

    第一次使用COM我有这个 COM dll 比如 ABCServer dll 我创建了一个 RCW 并在我的项目中添加了对它的引用 现在 我的应用程序创建了多个线程 每个线程从 COM dll 创建某些类并使用它们 但是 当其他线程正在处理
  • Java ASN.1 编译器

    现在我正在使用二进制笔记 http bnotes sourceforge net 解析 ASN 1 文件以在 Java 项目中使用 它采用 ASN 1 定义并生成 Java 类 让我可以操作 ASN 1 文件 我用扩展标记碰壁了 因为它不支
  • 奥尔良谷物任务调用结果

    对于这个长问题我深表歉意 我一直在对奥尔良进行实验 以了解它的各种特性 这些问题在逻辑上都归为一类 第一个测试涉及客户端每 1 秒向特定 Grain 发出一次请求 而 Grain 需要 10 秒来执行请求 代码是这样的 client cod
  • 有用的 Delphi 代码模板

    我用 Delphi 编程已经两年多了 我大概只有 5 个自定义模板 我觉得我应该有更多 如果有人有任何特别有用的东西 那么在 stackoverflow 上有一个很好的存储库就太好了 我不在乎您使用的是 Delphi 2009 语法还是 D
  • Flutter 中声明式编程和命令式编程有什么区别?

    最近 我正在寻找一种方法来增强 Flutter 应用程序中屏幕之间的导航 我发现了新的编程概念 陈述性的 and 至关重要的编程 我需要了解更多关于陈述性的 and 至关重要的范例以及 Flutter 中的示例 声明式路由意味着您的应用程序
  • 使用 pip 或 conda 来管理包? [复制]

    这个问题在这里已经有答案了 我已经使用 matlab 进行机器学习很长一段时间了 最 近切换到 python 并使用其包管理器 pip 安装某些包并成功安装了许多包 几天前 我开始使用 conda 我以前安装的所有软件包都被覆盖 我真的很想
  • 用户警告:MovieWriter ffmpeg 不可用

    尝试在 google colab 上制作动画 收到此警告 用户警告 MovieWriter ffmpeg 不可用 warnings warn MovieWriter s 不可用 writer did pip 安装 ffmpeg 标准化但没有
  • 在一个查询中对同一个表进行多个 COUNT SELECT

    对于某些人来说 这可能看起来很简单 但我就是无法理解 我一遍又一遍地从同一个表中进行多个 MS SQL SELECT 查询 SELECT count Page as tAEC FROM someTable WHERE Page LIKE A
  • 访问 UserDefault 数组 URL 以填充 CollectionView

    这是上一篇文章的后续内容here https stackoverflow com questions 48142238 save and append an array in userdefaults from imagepickercon
  • 按名称显示进程的命令行

    我在cmd中使用以下命令来获取进程命令行 它提供了所有流程的详细信息 WMIC OUTPUT C ProcessList txt PROCESS get Caption Commandline Processid 我想在记事本中按名称获取特
  • 您如何在 Android 上处理超高 MP 相机(和图像)? - “画布:尝试绘制太大的位图”

    我有一个活动 用户可以像这样打开相机 getPictureUri createImageFromFile true let photoUri it openCameraActivity REQUEST IMAGE CAPTURE it ph
  • 逆向调试如何进行?

    GDB 推出了支持反向调试的新版本 请参阅http www gnu org software gdb news reversible html http www gnu org software gdb news reversible ht
  • 为什么乘法比除法便宜?

    我最近编写了一个 Vector 3 类 并将我的 normalize 函数提交给朋友审阅 他说这很好 但我应该尽可能乘以倒数 因为在 CPU 时间上 乘法比除法便宜 我的问题很简单 这是为什么 从硬件可以更轻松地实现的基本运算的角度来考虑
  • 使用 Sequelize (NodeJS) 代替 * 指定特定字段

    好吧 我在 NodeJS 中有一个项目 我正在其中使用 Sequelize 来实现 MySQL ORM 这件事工作得非常好 但是我试图弄清楚是否有一种方法可以指定在查询的基础上返回哪些字段 或者是否有一种方法可以在某处执行 query 例如
  • SQL Server 中全文搜索的奇怪行为

    我的 MyTable 带有列消息 NVARCHAR MAX ID 为 1 的记录包含消息 0123456789333444 Test 当我运行以下查询时 DECLARE Keyword NVARCHAR 100 SET Keyword 01
  • 通过shell脚本进行串口控制

    我正在开发一个方向控制器 我有一个开发板 它通过 I2C 与传感器 指南针 通信 由于主板非常有限 没有操作系统 我开发了一个简单的程序来接收以下内容 1 get 0 读取传感器的寄存器 0 2 set 0 10 将传感器的寄存器 0 设置