【问题标题】:Unable to get Data from Serial Device using Arduino无法使用 Arduino 从串行设备获取数据
【发布时间】:2014-06-30 09:58:06
【问题描述】:


我正在尝试从超声波燃料传感器(the link)读取数据。该设备的波特率为 9600。该设备基本上定期发送数据。我可以使用终端读取 PC 中的输出软件。下面是一个示例。

例如:*XD,205B,00,0000,0031,0000,0000,null#

我正在尝试通过设备中提供的串行端口将此设备连接到 Arduino,当我看到串行监视器时,输出不正确。下面是示例。

5320215115451166102572432302302432302302302302432303816623024323023023023024323023023023051822281141463

String incoming_char;      // Will hold the incoming character from the Serial Port.

void setup()
{
  //Initialize serial ports for communication.
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial.println("Starting Communication with Fuel Sensor");
}
void loop()
{

 //If a character comes in from the cellular module...

  if(Serial1.available() >0)
  {
    incoming_char=String(Serial1.read());    // Get the character from the cellular serial port.
    Serial.print(incoming_char);  // Print the incoming character to the terminal.
  }
}

Arduino 由 USB 供电,设备由 12V 电源供电。 来自设备的电压电平 Tx-GND=-5.44V,Rx-GND=-8.22V。

我最初认为问题可能是因为电压范围并制作了一个分压器电路并为 Arduino 提供了成比例的电压。即使这样也不起作用。 那么,出了什么问题?请指导我。

【问题讨论】:

  • 你在混淆 ASCII 和二进制数据。 Something 将字符串中的字符显示为整数而不是字符。
  • 雅汉斯,我切换到 Serial.write,现在它正在打印垃圾字符。显然,这个字符集正在转换为数字。

标签: serial-port arduino sensors


【解决方案1】:

由于您使用的是 Serial1,我假设您使用的是 Arduino Mega?

根据您的问题,我想说问题不在于电压等,而更有可能是您读取数据的方式。您假设传感器将返回 char 值。是否有任何关于退货的规范?

我使用 Arduino 创建了一个类似的项目。除了我的超声波设备被用作测距仪。有详情here。正如您在代码中看到的,范围从传感器返回为一个两字节整数。

您需要找出超声波燃料传感器返回的内容并以类似方式读取。

【讨论】:

  • 嗨 GolgiDevang,我使用的是 Arduino Mega 2560。实际上,规范说它使用 ASCII 格式,格式为“(*XD, efgh, ij, klmn, abcd, opqr, stuv, wxyz #).
  • 好吧,我认为您正在使用串行与您的 LCD 显示器进行通信是对的吗?您是否尝试过将硬编码的内容打印到屏幕上。我还注意到传感器描述有两个输出的 RS232 和模拟。是同时输出还是有开关?您是否使用带有 DB9 连接器的 RS232 在您的 PC 上进行了测试?
  • 嗨 GolgiDevang,我只是使用串行接口,因为所需的数据仅在串行输出中给出。我用 DB9 连接器进行了测试,它显示了输出。看来,问题现在解决了.感谢您的意见。
【解决方案2】:

好的,我首先建议您将其连接到模拟引脚以进行读取。您必须通过测量和除法来找到燃料高度和电压之间的比率。然后在代码中插入乘法,你就可以设置它看起来像高而不是电压

【讨论】:

  • 嗨 user3792207,问题是,我们不只是在寻找高度。我们正在寻找表面温度,信号质量,这恰好是这个串行输出的一部分。
  • 哦,好吧,对不起,我不能帮助你。我在这方面相对较新。抱歉,我无法提供更多帮助,我希望您的项目进展顺利
  • 没问题 user3792207..即使,我是新手。看来,我已经越过了一个障碍。希望也能越过其他人。感谢您的投入。
【解决方案3】:

这只是一个疯狂的猜测,因为我没有 Arduino Mega(我有 Duemilanove 和 Uno),但我从事的项目中遇到了与您所遇到的问题类似的问题。有时在 void loop() 块上添加 delay() 会有所帮助,并为 arduino 提供足够的时间从缓冲区读取字节。对于 9600 波特率,读取 1 个字节通常需要大约 1 ms,因此需要添加延迟。

void loop()
{

 //If a character comes in from the cellular module...

  if(Serial1.available() >0)
  {
    incoming_char=String(Serial1.read());    // Get the character from the cellular serial port.
    Serial.print(incoming_char);  // Print the incoming character to the terminal.
  }
  delay(100);
}

【讨论】:

  • 嗨,格林..感谢您的意见。
【解决方案4】:

谢谢大家!为您的值输入。问题是,我试图将 RS232 串行(使用负电压)连接到 Arduino 中使用的 TTL 串行接口(使用 0 到某些正电压)。显然,我正在向 Arduino 提供负电压,而预计它会提供正电压。所以,得到一个 RS232 转 TTL 连接器,它终于工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多