如何用 C 语言从串行(SPI)连接读取数据?

2024-04-21

我正在尝试编写一个程序,该程序将安装在 Linux MCU(Raspberry Pi)上,该程序将读取从另一个 MCU(我将自己构建的自制程序)发送到它的串行数据。

我研究了如何做到这一点,并认为我有“大局”,但仍然缺少一些东西。其一,我需要启用内核模块并允许自己访问设备:

sudo modprobe spi_bcm2708
sudo chown `id -u`.`id -g` /dev/spidev0.*

从那里我可以使用这个著名的C文件 http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/spi/spidev_test.c测试 SPI 连接。

现在连接已经存在,但我仍然需要从中读取串行数据。根据答案这个问题 https://stackoverflow.com/questions/8600275/how-do-i-read-data-from-serial-port-in-linux-using-c,我只需要:

...打开相关端口进行读取,并使用read()获取数据。

然而,该答案中的代码片段似乎是通过设备驱动程序而不是通过 SPI 打开端口。

My 理解是我可以使用 SPI 从连接的 MCU 设备读取数据,并且我会not需要为该设备编写我自己的设备驱动程序。这是真的?如果是这样,我将如何从 SPI 连接读取数据,该代码与上面链接问题的答案中的代码有何不同?

如果我的理解不正确,并且我确实“通读”了设备驱动程序,那么为什么我首先需要驱动程序?这不就是SPI希望规避的吗?提前致谢。


我正在尝试编写一个程序,该程序将安装在 Linux MCU(Raspberry Pi)上,该程序将读取从另一个 MCU(我将自己构建的自制程序)发送到它的串行数据。

[MCU不是正确使用的术语。 Raspberry Pi 使用 SoC(片上系统)。微控制器比 SoC 更便宜、更简单。如果你想使用TLA,那么就使用SBC,单板计算机。]

[您误用了术语“串行端口”和“串行数据”。如今,由于 PC 的普及,“串行端口”已专门指 EIA/RS-232 异步串行连接。 SPI。 USB。 I2C、TWI、SATA等等不应将其称为“串行”连接,除非您正在解释它们的工作原理。]

在 Linux 中,SPI 设备驱动程序通常作为“平台驱动程序”而不是字符驱动程序。因此这样的驱动程序不会有文件操作,或者fops, 去表演open(), read(), write() or close()。此类操作针对的是平台设备连接到系统的目标设备。因此,平台设备中没有设备节点/dev就像目标设备一样。 SPI与USB、PCI属于同一类别;它们都是总线,通常作为平台驱动程序实现。

我的理解是,我可以使用 SPI 从连接的 MCU 设备读取数据,并且我不需要为该设备编写自己的设备驱动程序。这是真的?

答案取决于您使用的内核是否有公开的 SPI 字符设备供您的用户程序使用。但如果 SPI 驱动程序是平台驱动程序,则必须实现自定义 SBC 的设备驱动程序。该目标设备需要一个节点/dev、分配的主要号码和次要号码以及与这些号码关联的驱动程序。该驱动程序将利用 SPI 驱动程序提供的平台操作或使用 Linux SPI API 来执行传输。 SPI 及其驱动程序只是用于在该处理器和目标设备之间传输数据的管道。与 SATA 和 PCI 一样,用户很少意识到这些将外围设备连接到计算机的(内部)总线。

linux/drivers/spi/spi_bcm2708.c是一个平台驱动程序。它没有fops支持/执行open(), read(), write() or close()运营。它将自己注册为 SPI 主设备,因此其他(目标)驱动程序可以使用 SPI API 为其服务。

在我看来,您最好在 RPI 和您的自定义 SBC 之间实现 EIA/RS-232 链接。如果使用非规范(原始)传输,那么当您转换/升级到 SPI 连接时,您编写的代码可能有 99% 都可以重用。无流量控制的 3 线串行连接类似于 SPI 连接,但没有强加主/从层次结构、更简单的硬件接口以及更长的电缆长度。

请注意,无论使用何种电缆,您都可能无法在长 SPI 距离下实现快速传输速率。 SPI 的 10 Mbps 速率通常在具有接地层和短走线的多层板上实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 C 语言从串行(SPI)连接读取数据? 的相关文章

  • 获取数组变量的地址是什么意思?

    今天我读到了一段让我很困惑的 C 代码片段 include
  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • TcpClient 在异步读取期间断开连接

    我有几个关于完成 tcp 连接的问题 客户端使用 Tcp 连接到我的服务器 在接受客户端后listener BeginAcceptTcpClient ConnectionEstabilishedCallback null 我开始阅读netw
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • libxml2 xmlChar * 到 std::wstring

    libxml2似乎将所有字符串存储在 UTF 8 中 如xmlChar xmlChar This is a basic byte in an UTF 8 encoded string It s unsigned allowing to pi
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 具有 Jetty 连接器的 Restlet 2.0.8 不会恢复 SSL 会话,而 Simple 连接器会恢复 SSL 会话

    有谁知道这是为什么 或者如何解决它 我正在使用 android 通过 httpclient 连接 简单连接器恢复连接很好 但 Jetty 每次都会执行新的握手 代码是相同的 这只是我在构建路径上获得的连接器 不断地重做握手会消耗大量的数据和
  • 如何使弹丸转弯时带有弧线

    我有一门大炮 可以以抛物线弧线发射子弹 现在 当我发射子弹时 子弹的旋转速度与从大炮中发射时的旋转速度相同 如何使子弹在空气中飞行时沿着弧线旋转 我尝试了以下作为在项目符号上运行的脚本 附件1 public class PointingBe
  • SQL Server Reporting Services 2008 R2 始终显示登录提示

    每当我尝试通过 URL 访问 SSRS 2008 R2 即在网络上发布后 时 访问报告时总是显示登录提示 开发环境中不会出现该问题 如何防止在我尝试访问报告时显示此登录提示 目前 我们正在通过提供用户名和密码来解决这个问题
  • 模拟器未切换到下一个活动

    我对 Android 编程完全陌生 我正在做一个简单的应用程序 其中显示启动屏幕 然后显示登录屏幕 问题是模拟器不会超出启动屏幕 Android 清单
  • Groovy - XmlNodePrinter 打印空白文件

    我正在尝试将格式化的 xml 打印到文件中 但我的 XmlNodePrinter 仅打印一个空白文件 我认为我传入的 xml 对象已正确填充 我可以使用 StreamingMarkupBuilder 打印它 但它的格式全部在一行上 我不知道
  • 如何设置 Xamarin Picker 中项目列表的样式(在 Android 中)

    我有一个 Xamarin Android 应用程序 它使用选取器从值列表中进行选择 我一直在改变应用程序的风格 但遇到了选择器的问题 虽然我可以设置 TextColor 但无法设置占位符文本的颜色 在搜索帮助后 我实现了一个自定义渲染器 现
  • Jekyll:不允许操作@apply2files

    我正在使用 Windows 10 的 Linux 子系统 我在其中安装了 Jekyll 但是当我运行时bundle exec jekyll serve它给了我 jekyll 3 8 6 Error Operation not permitt
  • 检测视口单元(使用modernizr或普通js)并提供适当的样式表

    实际上 三周以来我一直在尝试解决一个问题 我正在尝试测试对大众单位的支持 并在浏览器不支持该单位时提供单独的样式表 我阅读了modernizr教程并且熟悉modernizr css检测 但是我在网上没有找到vh单位 视口相对单位 的测试 所
  • 不同子域上的会话 cookie 是否算作第 3 方?

    假设我有一个网站www example com其中有一个 IFRAME 指向 ASP NET 站点myapp othersite com 据我所知 这会导致会话和第三方 cookie 出现问题 如果我将嵌入式应用程序移至myapp exam
  • Python 格式化小数,具有最少小数位数

    我有一些DecimalPython 中的实例 我希望将它们格式化为 Decimal 1 gt 1 00 Decimal 12 0 gt 12 00 Decimal 314 1 gt 314 10 Decimal 314 151 gt 314
  • 使用 NHibernate 在延迟加载场景中使用 Castle.DynamicProxy 实现 IDataErrorInfo

    我已经使用 Castle DynamicProxy IIterceptor 实现了 IDataErrorInfo 接口 我还实现了一个 NHibernate 拦截器 它使用该拦截器实例化我的实体 问题在于延迟加载的实体 这些是使用 nhib
  • 在现代 Perl 中编写异常类的最佳实践

    With Exception Class https metacpan org pod Exception Class 我可以将异常定义为类 并且一旦将它们加载到任何地方 它们就可以在任何地方使用 但是很多地方 包括 E C 本身的文档 都
  • 在 Inno Setup 中获取 MAC 地址

    我尝试使用下面的代码来获取 Inno Setup 中的 mac 地址 但出现错误 内部错误 ExtractTemporaryFile 找不到文件 ISID dll 我已经复制了ISID dll在应用程序文件夹中仍然出现上述错误 如果我遗漏了
  • ggplot 中不同宽度的堆积条形图

    我尝试构建一个具有不同宽度的堆积条形图 以便宽度表示分配的平均数量 而高度表示分配的数量 接下来 您将找到我的可重现数据 procedure c method1 method2 method3 method4 method1 method2
  • 如何将整数转换为字符串? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 Objective C 中从 int 转换为 string 示例代码 https stackoverflow com questions 1104815 how to convert from
  • 尝试从c++ linux执行命令行代码

    我尝试了以下代码 从 C 代码与命令行进行通信 include
  • 使用 Python 请求发送 SOAP 请求

    是否可以使用Python的requests http docs python requests org en master 库发送 SOAP 请求 这确实是可能的 以下是使用普通请求库调用天气 SOAP 服务的示例 import reque
  • Docker 命令无法连接到 Docker 守护进程

    我想转向 Docker 所以我刚刚开始尝试它 我已经在 VirtualBox Ubuntu 15 10 Wily Werewolf 安装上安装了 Docker 并且作为在这里建议 https blog docker com 2015 04
  • Ecma6,Object.assign 不进行深层复制[重复]

    这个问题在这里已经有答案了 dst a 1 src edf zyx right Object assign dst src src edf zyx wrong console log dst edf zyx 我期待看到 right 作为输出
  • 如何用 C 语言从串行(SPI)连接读取数据?

    我正在尝试编写一个程序 该程序将安装在 Linux MCU Raspberry Pi 上 该程序将读取从另一个 MCU 我将自己构建的自制程序 发送到它的串行数据 我研究了如何做到这一点 并认为我有 大局 但仍然缺少一些东西 其一 我需要启