【发布时间】: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