我一直在研究一個簡單的XBee/Arduino/Python傳輸系統。以下是它的工作方式:十進制命令從python發送到arbeino接收的xbee。這觸發它使用Adafruit TTL串行攝像機拍攝照片。然後圖像保存在內存中,並通過xbee發送到計算機,一次32字節。然後Python腳本將這些字節添加到.jpg中,以便在完成時查看。將XBee從57.6k更改爲115.2k導致TTL相機和PySerial問題
到目前爲止,兩者都運行良好,儘管我的需求慢了一些(大約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,所以我可能在這裏忽略了一些東西。任何更有經驗的人都會想到爲什麼波特率開關會打破它?
聽起來像是一個合理的原因。我沒有意識到XBees無法保持這種速度。我將開始在流量控制系統中進行編碼。 – Horizon
但我注意到一個奇怪的問題。當我將Arduino連接到筆記本電腦並將其設置爲115200波特時,傳輸速率大致與57.6k(〜23-26秒)相同。我認爲緩慢與我使用的緩衝區有關。 – Horizon