首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Windows 8读写OBD-II适配器的数据?

如何使用Windows 8读写OBD-II适配器的数据?
EN

Stack Overflow用户
提问于 2013-12-09 17:44:09
回答 1查看 28.5K关注 0票数 4

我目前正在开发一个Windows 8应用程序,它将(希望)能够使用蓝牙OBD-II适配器通过蓝牙连接到车辆上。我对WP8的编程相当陌生,尽管我试图不尝试并寻求帮助,但我遇到了一个我无法思考、也不知道该去哪里或该做什么的部分。

另外,如果有人想知道我正在测试的连接到汽车上的设备,那就是这个家伙这里

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

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

因此,如果我正确地理解了这一点,我就需要检查它的>,对吗?但是怎么做呢?我查了很多资料,但都没有解释怎么做。我遇到了像IBuffer这样的东西,但我对此一点也不了解。

如果我所说的毫无意义,那就简单地说。

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

如果我能够理解如何对其进行读写,那么我认为我应该能够将数据操作回用户;我希望。

编辑2:

代码语言:javascript
复制
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; 
            }
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2013-12-11 16:44:39

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

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

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

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

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

模式1发送

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

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

代码语言:javascript
复制
'010D\r'

接收方式1

您将从模式1查询中得到的答案,从'41‘开始。然后返回参数ID,然后返回值。这个值在大多数情况下都是十六进制。您必须进行一些转换才能读取人类可读的值。有关更多信息,请参见链接,因为也提供了转换公式。

示例:

代码语言:javascript
复制
'410D17'

17是你现在的速度的值。17到小数点是23,所以你以23公里/小时的速度行驶。

这个维基百科页面提供了一些很好的信息:

OBD-Ⅱ参数

至于蓝牙部分:

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

代码语言:javascript
复制
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查找

代码语言:javascript
复制
await socket.ConnectAsync(pi.HostName, pi.ServiceName);

来源:Windows Phone 8蓝牙SSP

我希望这能帮到你,我对此很兴奋。如果你需要帮助,请告诉我。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20477092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档