将XBee从57.6k更改为115.2k会导致TTL相机和PySeri出现问题

2024-07-07 06:34:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在研究一个简单的XBee/Arduino/Python传输系统。它的工作原理如下:一个hex命令通过xbee从python发送,由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脚本:

^{pr2}$

我对串行通信和xbees还是有点陌生,所以我可能忽略了一些东西。有没有经验丰富的人有什么想法,为什么波特率开关打破了它?在


Tags: adafruit脚本if字节bufferserialarduinojpg
1条回答
网友
1楼 · 发布于 2024-07-07 06:34:53

我很确定这和流量控制有关。在

XBee模块无法跟上115200的稳定数据流,因此需要将其配置为使用hardware flow control。在您的例子中,您需要观察来自XBee模块的CTS(clear to send)行,并让您的程序在没有断言(保持低位)时延迟发送更多数据。在

您还可以配置XBee使用它的一个输入来发送RTS(请求发送)信号,主机用这条线通知XBee模块何时可以接收数据。在

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

相关问题 更多 >