2017-02-01 5 views
2

rpi3をマスタとして、picをスレーブに、rs485をネットワーク媒体として使用しようとしています。 rpiはスレーブIDをループし、1つずつ送信し、指定されたスレーブからの応答を待ちます(pic)。 すべてのピクチャは受信したデータ(アドレス)を読み込んでそのアドレスと比較し、一致した場合はrpiに返信する必要があります。rs485上の複数の画像を持つRPI - CCSコンパイラ

私はpi4j Javaライブラリを使用していますが、写真ではCCSコンパイラでコーディングしています。

最初の問題は、写真には存在しないアドレスをrpiから送信すると、誰もrpiに返信せず、次の指示にそのアドレスを送信する写真も返信しないということです。

RPI用のコードです:PICのコードは、すべての写真の間で共通である

import com.pi4j.io.gpio.GpioController; 
import com.pi4j.io.gpio.GpioFactory; 
import com.pi4j.io.gpio.GpioPinDigitalOutput; 
import com.pi4j.io.gpio.PinState; 
import com.pi4j.io.gpio.RaspiPin; 
import com.pi4j.io.serial.*; 
import com.pi4j.util.Console; 

import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.sql.Time; 


public class SerialExample { 

    public void tryIt() throws InterruptedException, IOException { 

     final Console console = new Console(); 

     // print program title/header 
     console.title("<-- The Pi4J Project -->", "Serial Communication Example"); 

     // allow for user to exit program using CTRL-C 
     console.promptForExit(); 

     // create an instance of the serial communications class 
     final Serial serial = SerialFactory.createInstance(); 

     try { 
      // create serial config object 
      SerialConfig config = new SerialConfig(); 

      config.device("/dev/ttyAMA0") 
        .baud(Baud._9600) 
        .dataBits(DataBits._8) 
        .parity(Parity.NONE) 
        .stopBits(StopBits._1) 
        .flowControl(FlowControl.NONE); 


      // open the default serial device/port with the configuration settings 
      serial.open(config); 
      final GpioController gpio = GpioFactory.getInstance(); 

      // provision gpio pin #01 as an output pin and turn on 
      final GpioPinDigitalOutput cts = gpio.provisionDigitalOutputPin(RaspiPin.GPIO_04, "CTS", PinState.HIGH); 

      while (true) { 
       short i = 1; // pic ids 
       while (i < 5) { 
        cts.high(); 
        serial.write(String.valueOf(i)); 
        System.out.println("to slave: " + i); 
        Thread.sleep(15); 
        cts.low(); 
        Thread.sleep(150); 
        byte[] data = null; 

        while (serial.available() > 0) { 
         data = serial.read(); 
        } 
        if (data == null) { 
         System.out.println("[null data]"); 
        } else { 
         String myData = new String(data); 
         System.out.println("reply from slave: " + myData); 
        } 
        i++; 
        Thread.sleep(1000); 
       } 
      } 
     } catch (IOException ex) { 
      console.println(" ==>> SERIAL SETUP FAILED : " + ex.getMessage()); 
      return; 
     } 
    } 
} 

、唯一の違いは、IDSです。 I)は(clear_usart_receiverを除去しようとしている

#include <12F1822.h> 
#include <String.h> 
#fuses NOMCLR INTRC_IO PLL_SW 
#use delay(clock=32000000) 

#use rs232(baud=9600, xmit=Pin_A0, rcv=Pin_A1,enable=Pin_A2, bits=8, errors, stream=RS485) 

void clear_usart_receiver(void) { 
    char c; 
    c = getc(); 
    c = getc(); 
} 
int id [] = {0, 2}; 

void main() { 

    while (1) { 
     byte message[10]; 
     fgets(message, RS485); 
     delay_ms(10); 
     if (message[0] == '2') 

     { 
      fputs("s2 reply", RS485); 
     } 
     delay_ms(10); 
     clear_usart_receiver(); 
    } 
} 

PICコードです。私の写真コードからは、写真が返ってくると、次の写真は予定どおりに印刷されません。次は何も印刷されません。

+0

どのようにシリアル通信を多重化していますか?ブロックダイアグラムや回路図をアップロードできますか? –

+0

"写真には存在しないアドレスをrpiから送信すると誰もrpiに返信しません"仕様通りですか?存在しないものに対処しようとすると、システムが正しく構成されていません。 – Lundin

答えて

0

1つの明らかな問題は、9600のUARTで10バイトのデータを送信すると10ミリ秒より長くかかることです。自家製のデッド・ウェイト・ディレイは使用しないでください。代わりに、ループ内のUART rxフラグをポーリングしてください。

1バイトのデータ= 1つのスタートビット、8データビット、1ストップビット(無partity、1つのストップビット)は、^ 9600を取る-1米国を1ビットを送信するために10ビット

を=ありません。 PIC側で

9600^-1 * 10ビット×10バイト= 10.42ms最良のシナリオ

0

、関数fgets()はCR文字、を待っていますが、RPIからそれをを送信しません。もう一つの問題は、おそらく

一方(serial.available()> 0){ データ= serial.read()です。 }

変数dataを上書きし続けると思われます。

関連する問題