2014-06-08 26 views
2

我一直在研究一個簡單的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,所以我可能在這裏忽略了一些東西。任何更有經驗的人都會想到爲什麼波特率開關會打破它?

回答

0

我相當確定這將與流量控制有關。

XBee模塊無法在115200處跟蹤穩定的數據流,因此您需要將其配置爲使用hardware flow control。在你的情況下,你需要觀察來自XBee模塊的CTS(清除發送)行,並且當你的程序沒有被聲明(保持低電平)時,讓你的程序發送更多的數據。

您還可以配置XBee使用它的一個輸入作爲RTS(請求發送)信號 - 主機用來告訴XBee模塊何時準備好接收數據的線路。

您可能需要修改您的Arduino代碼,以將來自攝像機的整個圖像接收到緩衝區中,然後將其緩慢地發送回XBee模塊。如果您在發送每個字節之前檢查CTS行,那麼只要XBee模塊的緩衝區滿了,您就可以延期。您需要在主循環中調用一個函數來檢查緩衝數據的狀態以及引腳的狀態,以查看是否可以發送另一個字節。

+0

聽起來像是一個合理的原因。我沒有意識到XBees無法保持這種速度。我將開始在流量控制系統中進行編碼。 – Horizon

+0

但我注意到一個奇怪的問題。當我將Arduino連接到筆記本電腦並將其設置爲115200波特時,傳輸速率大致與57.6k(〜23-26秒)相同。我認爲緩慢與我使用的緩衝區有關。 – Horizon