我一直在研究一个简单的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还是有点陌生,所以我可能忽略了一些东西。有没有经验丰富的人有什么想法,为什么波特率开关打破了它?在
我很确定这和流量控制有关。在
XBee模块无法跟上115200的稳定数据流,因此需要将其配置为使用hardware flow control。在您的例子中,您需要观察来自XBee模块的
CTS
(clear to send)行,并让您的程序在没有断言(保持低位)时延迟发送更多数据。在您还可以配置XBee使用它的一个输入来发送
RTS
(请求发送)信号,主机用这条线通知XBee模块何时可以接收数据。在您可能需要修改您的Arduino代码,将整个图像从相机接收到一个缓冲区,然后缓慢地将其发送回XBee模块。如果要在发送每个字节之前检查CTS行,那么只要XBee模块的缓冲区已满,就可以推迟。您需要在主循环中调用一个函数来检查缓冲数据的状态,以及pin的状态来查看是否可以发送另一个字节。在
相关问题 更多 >
编程相关推荐