2017-12-08 26 views
0

MSP에서 라즈베리 파이 3 - 2 Xbee S1 모듈로 일부 패키지를 보내려고합니다.python-xbee 라이브러리 및 라즈베리가 포함 된 패키지가 누락되었습니다.

Xbee는 DigiMesh 2.4로 이스케이프 된 프레임, 라우터 및 다른 코디네이터로 구성됩니다. 나무 딸기에 연결은 USB 동글로한다.

내 코드는 MSP에서 CTS 흐름 제어로 10 us마다 패키지를 보냅니다. 코디네이터가 내 PC에서 실행중인 윈도우에 연결되면 XCTU를 통해 도착한 모든 패키지를 확인할 수 있습니다.

그러나 동글이 Raspbian과 Raspbian을 실행하고 다음 코드를 실행하면 일부 패키지가 도착할 수 없습니다.

모든 것이 XCTU에서 제대로 작동하기 때문에 문제는 코드에 있으며 직렬 포트 또는 이와 비슷한 것을 처리 할 수 ​​있습니다.

그래서 도움이 될 것입니다.

start.py :

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# copyright: Thiago Cruz <[email protected]> 

import sys 
import os 

from PyQt4 import QtGui 
from middleware.QueueMiddleware import QueueMiddleware 
from jobs.ScheduleJob import ScheduleJob 


def startQueue(): 
    queue = QueueMiddleware() 
    queue.start() 

def assyncSchedule(): 
    schedule = ScheduleJob() 
    schedule.run() 

def runApp(): 
    startQueue() 

    app = QtGui.QApplication(sys.argv) 


    sys.exit(app.exec_()) 


if __name__ == '__main__': 
    runApp() 

QueueMiddleware.py : 이미 time.sleep의 값 (변경하려) 이후의 스레드의 실행을 억제 한

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# copyright: Thiago Cruz <[email protected]> 

import threading 
import time 
import serial 
import Queue 

from middleware.DataProcessorGear import DataProcessorGear 
from xbee import ZigBee 

minutes = 0 

class QueueMiddleware(threading.Thread): 
    __instance = None 

    PORT = '/dev/ttyUSB0' 
    BAUD_RATE = 9600 

    # The XBee addresses I'm dealing with 
    BROADCAST = '\x00\x00\x00\x00\x00\x00\xFF\xFF' 
    UNKNOWN = '\xFF\xFE' # This is the 'I don't know' 16 bit address 

    def __new__(cls): 
     if QueueMiddleware.__instance is None: 
      QueueMiddleware.__instance = super(QueueMiddleware, cls).__new__(cls) 

     return QueueMiddleware.__instance 

    def __init__(self): 
     QueueMiddleware.__instance = self 
     threading.Thread.__init__(self) 
     self.dataPacketsQueue = Queue.Queue() 
     # Create API object, which spawns a new thread 
     self.ser = serial.Serial(
            port='/dev/ttyUSB0', 
            baudrate = 9600, 
            parity=serial.PARITY_NONE, 
            stopbits=serial.STOPBITS_ONE, 
            bytesize=serial.EIGHTBITS, 
            timeout=1 
           ) 
     self.xbeeApi = ZigBee(self.ser, callback=self.message_received, escaped=True) 
     print 'start queue' 

    def __del__(self): 
     # halt() must be called before closing the serial 
     # port in order to ensure proper thread shutdown 
     self.xbeeApi.halt() 
     self.ser.close() 
     self.processor = None 

    def run(self): 
     # Do other stuff in the main thread 
     while True: 
      try: 
       time.sleep(1) 
       #if self.dataPacketsQueue.qsize() > 0: 
       # lock = threading.Lock() 
       # processor = DataProcessorGear(self.dataPacketsQueue, lock) 
       # processor.start() 
      except KeyboardInterrupt: 
       break 

    def message_received(self, data): 
     global minutes 

     minutes += 1 
     print minutes 
     self.dataPacketsQueue.put(data, block=True, timeout=None) 

에 " 격리 "하십시오.

내 콘솔은 ~ 120에서 ~ 170까지의 값을 표시합니다. MSP는 200 개의 데이터 패키지 만 전송합니다!

그래서 ... 모든 추측 ??

미리 감사드립니다.

답변

0

하드웨어 흐름 제어를 활성화하고 9600에서 115200으로 전송 속도를 변경하십시오. 새 전송 속도에 맞게 XBee 모듈 구성을 업데이트해야하지만 패킷을 가져올 수 있습니다.

당신이 10ms가 아닌 10ms마다 패킷을 보내고 있다고 써야한다고 가정합니다. 10ms/패킷에서 100 패킷/초입니다. 9600 보오는 초당 약 960 자이며 패킷은 API 오버 헤드가있는 9 자보다 큽니다.

+0

실제로 패키지를 보낸 다음 10us를 기다립니다 ... 전송 속도를 변경하려고 시도했지만 아무 것도 변경되지 않았습니다. 내 코디네이터가 XBee S2C라고 언급하는 것을 잊지 마십시오. –

+0

추가 아이디어 : Python 코드 테스트 더 빠른 컴퓨터가 계속 작동하는지 확인하기위한 PC. 이스케이프 처리 된 API 모드 대신 일반 API 모드로 전환하여 이스케이프 코드의 오버 헤드를 줄이십시오. 수신 된 데이터를 대기열에 저장하지 않고도 계속 유지할 수 있는지 확인하십시오. Sleep이 모든 스레드를 중지시키지 않도록 sleep()을 0.001로 변경하십시오 (값의 변경은 언급했지만 값의 범위는 0.001 = 1ms가 아님). – tomlogic

0

솔루션의 종류 .....

내 코드에 다른 접근을 시도하면, 심지어 아래의 스크립트를 시도 ...

#!/usr/bin/python 
import serial 

serialport = serial.Serial("/dev/ttyUSB0", 115200, timeout=None,rtscts=True,dsrdtr=True) 

while True: 
    serialport.flush() 
    command = serialport.readline() 
    print str(command).encode('hex') 

나는가 원하는 을 얻을 수 있었다 동작 XBee MR 매개 변수 (메쉬 유니 캐스트 재시도 - 최대 네트워크 패킷 전달 시도 횟수)를 최대 (0x7)로 변경하면 패키지가 손실되지 않으며 각 패키지 전송 사이의 지연도 0입니다. 꾸러미.

아마, tomlogic에 의하면, 내가 더 빠른 PC에서 코드를 실행한다면, 나는 내 패키지를 얻을 것이라고 믿는다.

이 테스트를 수행 할 때 여기에 결과를 게시합니다.

감사합니다.