使用ToF距离传感器从处理中的USB端口流传输数据

问题描述 投票:0回答:2

我试图在处理中获取传感器的距离,但是当我在控制台中输出热量时,我只能看到ASCII文本。我该如何进行?

import com.hamoid.*;

// Example by Tom Igoe

import processing.serial.*;

float angle = 0;
int myString;


Serial myPort;  // The serial port


void setup() {

  size(500, 500);
  // List all the available serial ports
  printArray(Serial.list());
  // Open the port you are using at the rate you want:
  myPort = new Serial(this, Serial.list()[3], 115200);

}

void draw() {
  background(0);
  // Expand array size to the number of bytes you expect
  byte[] inBuffer = new byte[4];



  while (myPort.available() > 0) {
    inBuffer = myPort.readBytes();
    myPort.readBytes(inBuffer);
    if (inBuffer != null) {
      String myString = new String(inBuffer);
      println(myString);


    }
  }

}

这是我在运行代码时看到的:

T.T。T·T·T·T·T.T·T·T·T·T·T·T·T·T·T·T·T·T.T·T·T·T·T.T·T·T·T·T·T·T.T·T·T·T·T.T�T�

java processing sensor p5.js hardware-programming
2个回答
0
投票

@@ laancelot我已经使用过此草图,现在正在获取整数,但不是正确的整数。例如。下方:

84 6 177 84 6 194 177 84 6 189 203 84 6 194 177 84 6

这是我正在处理的草图:

    import com.hamoid.*;

// Example by Tom Igoe

import processing.serial.*;

int distance;

Serial port;  // The serial port

void setup() {

  printArray(Serial.list());
  // Open the port you are using at the rate you want:
  port = new Serial(this, Serial.list()[3], 115200);

}

void draw() {
  if (0 < port.available()) {  // If data is available to read,
    distance = port.read(); 
  }
    println(distance);
}

0
投票

让我们尝试显而易见的东西,然后从那里开始。

您有4个字节,表示32位。这非常接近32位整数,尤其是其他东西暗示着一个整数。唯一的坏处是我们不知道它是否真的是整数,即使是整数,我们仍然不知道它是有符号整数还是无符号整数。

首先尝试:我们使用的是Java,而Java则将byte视为有符号类型。让我们马上将其转换为整数:

// #1
if (inBuffer != null) {
  int distance = inBuffer;
  println(distance);
}

或者,我们可以通过Byte的一种方法获得一些成功(它基本上是相同的操作,但是我们永远不知道:)]]

// #2
if (inBuffer != null) {
  int distance = inBuffer.intValue();
  println(distance);
}

现在也许是未签名的。区别在于,符号(加号或减号,如“此数字小于或大于零”)占位,而无符号数字的所有位可用于存储部分数字而不是符号。您必须将其强制转换为“忽略”符号,如下所示:

// #3
if (inBuffer != null) {
  int distance = (inBuffer & 0xFF);
  println(distance);
}

以#1开始,然后是#3。我押在#3上,因为传感器上不需要负距离。让我知道您找到了什么!

================================================ ===========

这里是二进制数的入门。 (剧透警报:二进制代码很棒)

您可能知道,二进制数由1和0组成。而且,无论您是否知道,这都是我们整个社会赖以生存的基础。这和运算符。但是,让我们坚持二进制。

读取二进制文件时,必须从右向左读取。我的意思是,如果您是半机械人或其他类似的人,您可能可以轻松翻译它,就像我们通过正常阅读了解500万就是500万一样。但是要真正知道“ 5 000”中“ 5”的价值,您必须从右边开始阅读,否则您不知道跟随其后的零是多少,那么它意味着什么。

对于二进制,这是相同的,除了用十进制表示,每个左边的数字比最后一个数字值高10倍,而对于二进制,则是2倍。

在二进制中,右边的第一个数字为1。其他每个数字的值均为前一个的两倍。因此,对于一个字节,“ ones”的值如下:

128 64 32 16 8 4 2 1
 1   1  1  1 1 1 1 1 == 255
 1   0  0  0 0 0 1 0 == 130
 0   0  0  0 1 1 0 1 == 13

这是一个简单的加法(就像考虑任何数字一样)。它看起来很复杂,但是一旦您有了主意就很容易。

一个字节始终为8位。像这些示例:

[00000000] == 0
[11111111] == 255
[00001101] == 13

现在,如果我们查看您的传感器的规格,我们会发现以下3条信息:

8 data bits
no parity bit
one stop bit

其含义是:

  1. 数据将以8位(一个字节)为一束。
  2. 没有保留用于错误检测的位
  3. 一个特殊的位将告诉您通信何时开始或结束。
  4. 我们仍然不知道数据将是签名还是未签名(再次扰流警报:可能是未签名),但是我们已经开始在这里看到模式了。即使在您获得的字符串中,我们也可以检测到清晰的模式:

84 6

177 84 6 194177 84 6 189203 84 6 194177 84 6

问题是,这些可能不是整数。它们是机器的二进制解释为整数

。不一样。

您的传感器是“自由运行”的,这意味着它永远不会在等您。它总是在发送信号。每次发送完号码后,都会一直发送另一个号码。这可以解释为什么您的数据会出现这种循环。

现在,如果我们进一步研究细节,我们可以看到您的传感器协议不仅仅只是“发送距离”。比这更复杂。它是这样工作的:

  1. 它从一个包含7位地址和0(“写位”)的字节开始。那可能就是您读为“ 6”的内容。
  2. 它发送另一个带有地址的位,但末尾带有“ 1”(“读”位”。这可能是您读为“ 84”的内容。
  3. 它发送包含16位数字的2字节数据,这是您以毫米为单位的尺寸。
  4. 它发送一个校验和(一个字节)。
  5. 这很有意义。毕竟,您的传感器应该以毫米为单位读取,并且可以达到60 000 mm,这不可能只有一个字节(最高为255,记得吗?)。实际上,您不能用少于16位的二进制数编写6万。

现在,我们如何解释这些?

[第一件事,port.read()一次只读取一个字节,因此它不能一次读取16位。这就是您获得的数字没有意义的原因之一(8位仅在0到255之间,因此也无法获得更高的值)。

而不是立即尝试获取数字,让我们看看是否可以通过将它们重新输入二进制来计算当前输入背后的实际值:

194 == [11000010]
177 == [10110001]
[11000010 10110001] == 49 841


189 == [10111101]
203 == [11001011]
[10111101 11001011] == 48 587

您是否将它指向距离约5米的地方?那有意义吗?尝试将传感器指向您知道近似距离的物体,然后再做一次,只是为了好玩!和科学!

© www.soinside.com 2019 - 2024. All rights reserved.