【问题标题】:Changing XBee from 57.6k to 115.2k Causing Problems with TTL Camera and PySerial将 XBee 从 57.6k 更改为 115.2k 导致 TTL 相机和 PySerial 出现问题
【发布时间】:2014-06-08 20:42:09
【问题描述】:

我一直在研究一个简单的 XBee/Arduino/Python 传输系统。它是这样工作的:从 python 通过 xbee 发送一个十六进制命令,由 arduino 接收。这会触发它使用 Adafruit TTL 串行相机拍照。然后将图像保存在内存中并通过 xbee 发送到计算机,一次 32 个字节。然后 Python 脚本将字节添加到 .jpg 中,以便在完成时查看。

到目前为止,两者都运行良好,尽管对于我的需要来说有点慢(往返约 25 秒)。问题是,在 xbee 固件和程序中从 57600 波特切换到 115200 会导致它们失败。他们有时会给出大约一半正常大小的 .jpg,或者根本不传输,在这两种情况下,观众都无法阅读。我试过改变python端的超时时间,修改xbee的接口选项,都无济于事。

这是 Arduino 草图(主要改编自 Adafruit VC0706 示例库中的快照示例草图):

#include <Adafruit_VC0706.h>
#include <SoftwareSerial.h>

#define chipSelect 10

SoftwareSerial cameraConnection = SoftwareSerial(2,3);

Adafruit_VC0706 cam = Adafruit_VC0706(&cameraConnection);

void setup()
{
  Serial.begin(57600);
  pinMode(8, OUTPUT);

  if (cam.begin()){}
  else { return; } //Abort the transfer if camera does not initialize

  cam.setImageSize(VC0706_640x480);
}

void loop()
{
  if (Serial.read() == 0x01) //Wait for send command
  {
    snapAndSend();
    cam.reset();
  }
}
void snapAndSend()
{
  cam.takePicture();
  uint16_t jpgLen = cam.frameLength();

  while (jpgLen > 0)
  {                     //Send off 32 bytes of data at a time
    uint8_t *buffer;
    uint8_t bytesToRead = min(32, jpgLen);
    buffer = cam.readPicture(bytesToRead);
    Serial.write(buffer, bytesToRead);
    jpgLen -= bytesToRead;
  }
}

还有 Python 脚本:

import serial
import time


link = serial.Serial('COM12', 57600)
print("Engage!")

while True:
    answer = input("Press enter to take a picture (type ' to exit): ")
    if answer == "'":
        break
    file = open('imageTest.jpg', 'wb')
    link.write(b"\x01")
    time1 = time.time()
    while True:
        if link.inWaiting() > 0:
            file.write(link.read())
            time1 = time.time()
        else:
            time2 = time.time()
            if (time2 - time1) > .5:
                break


    print ("Complete! Closing file now...")
    file.close()

我对串行通信和 xbees 还是有点陌生​​,所以我可能在这里忽略了一些东西。任何更有经验的人对为什么波特率切换会破坏它有任何想法吗?

【问题讨论】:

    标签: python camera arduino xbee


    【解决方案1】:

    我相当肯定这将与流量控制有关。

    XBee 模块无法跟上 115200 的稳定数据流,因此需要将其配置为使用hardware flow control。在您的情况下,您需要查看 XBee 模块中的 CTS(清除发送)行,并让您的程序在未断言(保持低电平)时暂停发送更多数据。

    您还可以将 XBee 配置为将其输入之一用于RTS(请求发送)信号——主机用来告诉 XBee 模块何时准备好接收数据的线路。

    您可能需要修改您的 Arduino 代码以将整个图像从相机接收到缓冲区中,然后慢慢将其发送回 XBee 模块。如果您要在发送每个字节之前检查 CTS 行,那么只要 XBee 模块的缓冲区已满,您就可以推迟。您需要在主循环中调用一个函数来检查缓冲数据的状态,以及引脚的状态以查看是否可以发送另一个字节。

    【讨论】:

    • 听起来很合理。我没有意识到 XBees 跟不上那个速度。我将开始在流控制系统中编码。
    • 不过,我注意到了一个奇怪的问题。当我将 Arduino 硬连线到我的笔记本电脑并将其设置为 115200 波特时,传输速率大致与 57.6k(~23-26 秒)相同。我认为缓慢与我正在使用的缓冲区有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 2019-07-06
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多