【问题标题】:How can I read/write data to and from an OBD-II adapter with Windows Phone 8?如何使用 Windows Phone 8 在 OBD-II 适配器中读取/写入数据?
【发布时间】:2013-12-09 17:44:09
【问题描述】:

我目前正在开发一个 Windows Phone 8 应用程序,它(希望)能够使用蓝牙 OBD-II 适配器通过蓝牙连接到车辆。我对 WP8 编程相当陌生,虽然我试图不尝试寻求帮助,但我有点想不通,也不知道去哪里或做什么。

此外,如果有人想知道我正在测试连接到汽车的设备,那就是这个人here

编辑:: 到目前为止,我已经设置了我的代码来检测蓝牙适配器是否已启用,我目前正在研究(或试图了解)如何向用户显示配对的设备,以便他们可以选择一个。但我现在的主要脑块是,如何从 OBD-II 适配器读取(或提取)数据?它在软件文档中说:

为了表示 Kiwi Wifi 或 Kiwi 蓝牙已准备好处理命令,设备将输出一个大于号 (>)。

所以如果我理解正确的话,我需要检查 > ,对吗?但是怎么做?我已经检查了大量来源,但没有一个真正解释如何。我遇到过 IBuffer 之类的东西,但我完全不了解。

如果我说的没有意义,那就简单地说。

  • 从 OBD 适配器读取数据
  • 向 OBD 适配器写入数据(软件文档说我需要发送 ASCII 码,我有这些)

如果我能理解如何读取/写入它,那么我认为我应该能够将数据操作回给用户;我希望。

编辑 2::

private async void checkBluetooth()
    {
        SolidColorBrush statuscolor = new SolidColorBrush();
        try
        {
            PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
            var devices = await PeerFinder.FindAllPeersAsync(); 
            bluetoothStatus.Text = "Online"; 
            statuscolor.Color = Colors.Green; 
            bluetoothStatus.Foreground = statuscolor; 

            if (devices.Count == 0)
            {
                MessageBox.Show("No paired bluetooth devices have been found, please pair your OBD adapter first!");
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-bluetooth:"));
            }

            PeerInformation peerInfo = devices.FirstOrDefault(c => c.DisplayName.Contains("PLX"));
            if (peerInfo == null)
            {
                MessageBox.Show("No paired PLX adapter found, please pair the PLX OBD adapter!");
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-bluetooth:"));
            }

            StreamSocket socket = new StreamSocket();
            await socket.ConnectAsync(peerInfo.HostName, "1");

            await socket.ConnectAsync(peerInfo.HostName, peerInfo.ServiceName);
        }
        catch (Exception ex) 
        {
            if ((uint)ex.HResult == 0x8007048F) 
            {
                bluetoothStatus.Text = "Offline"; 
                statuscolor.Color = Colors.Red; 
                bluetoothStatus.Foreground = statuscolor; 
            }
        }
    }

【问题讨论】:

  • 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • 谢谢,我已经编辑了我的原始帖子。我希望它有所帮助。
  • 您到底想知道什么?我相信有蓝牙通信的样本,所以你可以试试。几个月来我都有同样的想法,但没有 WP8 手机来测试它。我有 OBD 的知识,但你真正想知道什么?
  • 我希望我编辑的帖子能净化一些空气,我想我还没有让它变得可以理解。我想知道如何向蓝牙 OBD 适配器读取/写入数据,以便读取车辆状态等。
  • 我将在今天晚些时候有时间的时候在答案中解释它。

标签: c# windows-phone-8 bluetooth obd-ii


【解决方案1】:

我只是在解释如何通过向 OBD-II 设备发送数据来检索数据,因为据我了解,这就是您正在努力解决的问题。

OBD-II 永远不会自行发送数据,它会侦听您发送的命令并根据该命令发送答案。所以基本上,如果你有一个正在运行的连接,你必须做两件事:

  • 向 OBD-II 设备发送正确的命令。
  • 将答案解析为人类可读的数据。

您拥有的 ELM327 蓝牙连接器将 ASCII 命令转换为电压。所以你所要做的就是发送一些 ASCII 命令,然后你会得到 ASCII 值。

OBD 协议知道几种模式和参数,但我将解释获取实时数据。那是模式1。

模式 1 发送
模式 1 是“01”。 在该部分之后,您必须发送一个参数 ID。 0C 代表 RPM,0D 代表速度。 在每个命令之后,您必须发送回车。 (CR = '\r') 所以连接器知道请求何时完成。

所以基本上,为了速度,你必须发送:

'010D\r'

接收方式一
您将从模式 1 查询中得到的答案以“41”开头。 之后返回参数 ID,然后返回值。 该值大部分时间为十六进制。您必须进行一些转换才能读取人类可读的值。有关详细信息,请参阅链接,因为还提供了要转换的公式。

例子:

'410D17'

所以 17 是您当前速度的十六进制值。 17 到十进制是 23,所以你以 23 公里/小时的速度行驶。

这个维基百科页面有一些很好的信息:
OBD-II Parameters

蓝牙部分:

第 1 步:通过 RFCOMM 连接到所需设备

PeerFinder.AlternateIdentities["Bluetooth:PAIRED"] = ""; 
var available_devices = await PeerFinder.FindAllPeersAsync(); 
if (available_devices.Count == 0) 
{ 
       return false;             
} 
else
{             
       PeerInformation pi= // Get the required device using 
                          // index or searching for the device name
}
StreamSocket socket = new StreamSocket(); 
await socket.ConnectAsync(pi.HostName, "1");

第 2 步:直接让 winsock 执行 SPP 查找

await socket.ConnectAsync(pi.HostName, pi.ServiceName);

来源: Windows Phone 8 Bluetooth SSP

我希望这对您有所帮助,我对此感到很兴奋。 ^^ 如果您需要帮助,请告诉我。

【讨论】:

  • 您的帖子肯定对我的情况有所了解,我对您所说的话更有信心。目前,我不能抽出一些时间做一些测试,不过我会在明天做。我确实有一些与你所说的有关的其他问题,但我想看看你给我的东西我能走多远。我非常感谢您的帮助。明天我会告诉你我的进展情况。
  • 还有,你有没有尝试过? :)
  • 抱歉,回复晚了,我已经测试了代码,并根据我在 Channel9 视频中看到的内容对其进行了一些调整。我不是 100% 确定它应该如何提供帮助,以及我如何读/写数据。另外,我注意到BT连接一直在下降,并做了一些研究,我说BT连接不是默认情况下是正确的吗?我将使用我拥有的代码更新我的主要帖子(关于检查 BT 状态以及您给我的代码)。我现在需要理解/弄清楚的是如何发送(我认为)一些 ASCII 代码并将其读回。
  • 是的,如果您能够使连接运行并且可以发送 ASCII 代码,那么您已经完成了最困难的部分。也许这个例子会对你有所帮助:32feet.codeplex.com/releases/view/100395 试着找一些例子,也许就清楚了。
  • 在对此进行了彻底的研究之后,包括 32 英尺。我确实最终使用了 32feet,但它提供了一些我无法理解的问题,我最终删除了它。如果我没记错的话,我从 MSDN 中找到了一个示例,现在我已经解决了我的连接问题。所以我的下一步是现在通过蓝牙读/写数据。我稍后会调查。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 2017-07-10
  • 2013-03-15
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多