问题标签 [peripherals]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
96 浏览

embedded - 访问计算机BUS的静态或动态宽度?

假设我们有一个简单的处理器,可以是一个嵌入式系统,有一个系统总线,为了论证,一个 32 位总线。

现在,如果我们有几个外设,例如一个名为 PER0 的外设连接到总线,我们可以做两件事:

  1. 允许它以固定宽度访问主总线,例如 8 位,这样 PER0 将始终以 8 位封装与总线通信。这我们可以称之为静态宽度访问

  2. 允许它通过使用告诉处理器它想要使用的访问模式的信号来选择如何根据数据大小与总线通信。例如,我们在处理器和 PER0 之间创建两个信号 A1 和 A0,其值将显示:

    00 - 等待
    01 - 8 位
    10 - 16 位
    11 - 32 位

    因此处理器将根据 A1、A0 的值知道是向其总线发送 8 位数据还是 32 位数据。这我们可以称之为 总线的动态宽度访问。

问题: 根据您的经验,这两种方法中的哪一种更受欢迎,为什么?另外,在哪些情况下应该实施?最后,考虑到嵌入式系统,哪种方法传播得更广?

编辑:我想扩展这个话题,所以我不是在询问个人喜好,而是关于这两种方法的更多信息,以及它们在计算机系统中的应用。因此,我认为这有资格作为一个合法的 stackoverflow 问题。

谢谢!

0 投票
2 回答
6163 浏览

bluetooth - 你如何获得核心蓝牙外设的真实UUID?

在 iOS 7 中,我正在编写一个核心蓝牙应用程序来从一系列外围设备获取广告包。每个外围设备在其广告数据包中都有一个唯一的 UUID,并显示在 LightBlue 嗅探器应用程序中。

当我在中央管理器中检测到外围设备时,它会分配一个与广告数据包中的 UUID 不同的 UUID。

根据文档:

“中央管理器第一次发现外围设备时,系统会为外围设备分配一个 UUID,由新的 NSUUID 对象表示。您的应用程序可以存储此 UUID,然后将其提供给中央管理器以用于检索此特定外围设备。外围设备是由 NSUUID UUID 标识,而不是由标识外围设备的服务、特征和特征的 CBUUID 对象标识”

为什么这样做?

我可以在不连接设备的情况下读取真正的外围 UUID 吗?

如何?

0 投票
0 回答
537 浏览

ios - 外设传输队列问题

我正在围绕 CoreBluetooth 开发一个简单的包装器,以将任何数据发送到任何设备。在开发过程中,我遇到了很多框架中的错误,它们非常烦人,为了使我的包装器稳定,我不得不缩短一些功能以提高可靠性。

现在我正在从外围设备发送数据。

好的,所以我有以下案例:

  • 客户要求动态特性的值
  • 我在服务器端收到回调 - peripheral:didReceiveReadRequest:。

注意:我需要在这个方法中响应这个 CBATTRequest - 我不能将它存储在其他地方并异步响应它。(我只是把一些 @“PrepareToReceiveValue” 块放在中央将被忽略。所有发送都在队列中完成。)

  • 为了为各种设备提供数据,我构建了一个包含 BTMessage 的队列。(所以对于 readRequest 我创建消息并将其添加到发送队列。如果块发送失败 - 我将从外围管理器获得有关 readyToUpdateSubscribers 的回调,并要求队列重新发送失败的块)
  • 因此,当我立即请求大量动态特征值并同时从外围设备向中央发送数据时,有时它只会冻结发送进度并导致断开连接。

经过几次测试,我发现这都是关于传输队列的:如果传输队列已满,您将收到读取请求 - 它只是不会响应它。

所以我有潜在的不稳定系统状态:

  1. 外围设备正在向某个中心发送数据。
  2. 在我的发送方法中,updateValue:forCharac... 返回 NO,因为传输队列已满。
  3. 此时,中心请求特性和外围设备的动态值:didReceiveReadRequest:调用将添加到当前运行循环。
  4. 从发送方法返回后,它将使 peripheral:didReceiveReadRequest: 方法出列并且响应此请求将无效(传输队列已满)。
  5. 所以在这种情况下,respondToRequest: 被忽略,就像我根本没有调用它一样。
  6. 在我响应请求之前,CoreBluetooth 将无法发送/接收任何数据。这就是冻结任何发送/接收进度并伴随断开连接的原因。
  7. 正如我之前提到的 - 我必须以适当的方法响应请求 - 否则它也将无效。(我这么说是因为如果队列已满,我试图将这些请求放入数组中,并在它有一些空间但没有运气时响应它们)。

我正在等待您的建议/建议如何解决这个问题,任何帮助将不胜感激。

0 投票
1 回答
920 浏览

casting - 将 volatile 表达式的结果强制转换为 void

笔记:

这与被问过很多次的事情不一样。是的,我已经阅读了许多关于铸造无效的帖子。这些问题都没有导致我怀疑这里的答案是正确的。


背景资料:

嵌入式 C。这与内存映射的易失性指针特别相关。换句话说,外围寄存器。

我在涉及写入 I2C 外围设备的例程中遇到了以下行:

I2C1被 #定义为 struct * 到易失性内存。

所以这一行的结果不是“避免编译器警告”,就像我在这里所做的所有搜索的答案一样。它实际上导致编译器读取该寄存器(因为它是易失性的)然后将其丢弃。该寄存器中有标志。读取寄存器的行为会导致标志清零。

现在这非常重要,因为目标是清除标志,而不仅仅是避免一些编译器警告!

然而,让我担心的是,在某种程度的优化或不同的编译器上,这段代码会被优化掉。那是我的问题:

这会被优化掉还是有办法保证它不会被优化掉?

我将所有相关代码放在下面:

在某个函数中的某个地方....

提前感谢您的帮助。对于像我这样的新手来说,这个网站是一个很好的资源。

0 投票
0 回答
23 浏览

ios - 如何在不“重新发明轮子”的情况下轻松地将 SDK 添加到现有项目中?

我有一个使用收据打印机 SDK 的应用程序。一切都很好,但集成非常复杂。我想添加另一个与不同打印机通信的 SDK,并让用户选择他们拥有的打印机。这台新打印机是一个全新的蜡球。

想到要让它们以同样好的方式工作需要做多少工作,我感到不知所措。例如,如果旧打印机需要 25 行来打印某些东西,那么新的 SDK 需要 2。所以,我不能只发送相同的新打印机NSOBject

如何轻松跟踪选择的打印机?在两个 SDK 之间“翻译”信息的简单方法是什么?旧打印机如何NSUserDefault与新打印机一样使用?(旧的需要 8 个参数,新的只需要 1 或 2 个)我可以编写某种智能类来规范所有这些吗?

我现在头晕目眩。

在 iOS 开发中,人们通常如何支持多个外设?

0 投票
0 回答
2040 浏览

android - 如何在 Android L 的 startAdvertising() 中设置 scanResponse 以将数据广告作为外围设备

如 Android L 中的 API 参考中所述,可在此处获得:https ://developer.android.com/preview/reference.html

使用蓝牙低功耗在 Android L 中启动广告数据的方法有两种:

  1. public void startAdvertising(AdvertiseSettings 设置、AdvertiseData 广告数据、AdvertiseCallback 回调)

  2. public void startAdvertising(AdvertiseSettings 设置、AdvertiseData AdvertisementData、AdvertiseData scanResponse、AdvertiseCallback 回调)

第二种方法包含另外一个参数:scanResponse

当我使用第一种方法时,一切正常,我可以扫描广告数据中设置的信息。但是,当我测试第二种方法时,我只能扫描并获取scanResponse中的数据,并且从LogCat中,我得到了以下错误: 在此处输入图像描述

在此处输入图像描述

这似乎是一个蓝牙缓冲区问题,在我的(广告)回调对象中,我记录了一句话:

从 LogCat 可以看出 onSuccess() 方法被调用了两次,我认为可能是以下两个原因之一: 1. 广告数据和 scanResponse 数据,而广告数据可能导致蓝牙问题,因此可能不被广播;2、advertiseData在启动(成功)(可能)后关闭(成功);

我是否以错误的方式使用了这种方法?我使用的是带有 Android L Preview 版本的 Nexus 5,还是当前 Android 系统的错误?

参考

方法:public void startAdvertising(AdvertiseSettings 设置、AdvertiseData AdvertisementData、AdvertiseData scanResponse、AdvertiseCallback 回调)

启动蓝牙 LE 广告。操作成功后会广播advertiseData。scanResponse 将在扫描设备发送主动扫描请求时返回。方法立即返回,操作状态通过回调传递。

需要 BLUETOOTH_ADMIN

参数

设置 用于蓝牙 LE 广告的设置。

advertiseData 广告数据包中要发布的广告数据。

scanResponse 与广告数据关联的扫描响应。

callback 广告状态回调。

0 投票
2 回答
2665 浏览

c - CMSIS 和外围设备驱动程序

CMSIS 文件和外围驱动程序文件中写入了哪些类型的代码。我怎样才能区分它们?任何例子都会更有帮助。谢谢你。

0 投票
1 回答
61 浏览

html - HTML5 和外围设备

我已经对此进行了搜索,我认为我实际上更加困惑。我们正在寻找一种解决方案,为移动设备提供刷卡器。只是一个刷卡器,我们不需要网关解决方案。

我们希望能够让某人刷卡,然后让卡信息自动填充到 HTML 表单中。

简单的问题:这可能吗?如果可以,有什么建议可以解决吗?我似乎在这方面找不到太多信息。

谢谢,

0 投票
1 回答
692 浏览

background - iOS CoreBluetooth 在后台同时作为外围设备和中央设备运行

我正在使用 iOS8 中的 CoreBluetooth 编写一个应用程序,该应用程序可以检测并连接到使用该应用程序的其他手机。我试图找出能够在两个应用程序都在后台创建连接的最佳方法,但是在两部手机都在后台+锁定的情况下遇到了困难。我遵循了这篇文章的建议:

如何在 iOS 7.1 中在后台和前台使用蓝牙 LE 检测附近的设备?

当两部手机都在后台+锁定时,我无法建立连接,但是我已经能够建立连接,其中外围设备和中央都在后台+锁定,然后我解锁中央(中央仍在后台) . 当我解锁外围设备时,虽然没有任何反应。当它们处于后台但未锁定时,它也可以工作。

因此,为了在我解锁“外设”时允许建立连接,我决定在两部手机上创建一个中心和外设,以同时扫描和发布广告。无论哪个先发现另一个,都会停止扫描/广告并连接。我遇到了以下两个问题中详细介绍的这种方法的问题:

在 iOS 上同时使用外设和中央

iOS CoreBluetooth 同时外设和中央管理器

基本上,我认为当我的两个设备尝试同时相互连接时,它们会在尝试连接时挂断,并且从不会在其中任何一个上调用 didConnectPeripheral(它们显示的最后一件事是一条消息,表明它们是尝试连接)。虽然它偶尔会起作用,所以我也有点困惑,为什么连接具有概率性质。有没有人对如何解决这个问题有任何建议?如果在两个应用程序都在后台+锁定时建立连接有更好的方法,请告诉我,因为那是我最初的问题。

谢谢!

0 投票
1 回答
713 浏览

android - Android 5.0 外围模式,如何向扫描响应中添加数据

从安卓设备做广告时(支持 BLE 外设模式)

有没有办法将广告数据元素添加到扫描响应中?

我认为当中心角色设备正在执行主动扫描时发送空扫描响应,因为我们在自己的硬件中接收到两个 RSSI 值