2017-02-01 21 views
2

Я пытаюсь delpoy rpi3 как master, pic as slave и rs485 в качестве сетевого носителя. Rpi перебирает идентификаторы ведомых, отправляет их один за другим и ждет ответа от указанного подчиненного устройства (рис.). Каждый pic считывает полученные данные (адрес) и сравнивает его с его адресом, если он один, pic должен отвечать на rpi.RPI с несколькими фото по rs485 - компилятор CCS

На rpi Я использую java-библиотеку pi4j, а на фотографиях я кодирую с помощью компилятора CCS.

Первая проблема заключается в том, что когда я отправляю из rpi адрес, который не существует в pics, никто не отвечает на 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; 
     } 
    } 
} 

Код на картинке распространен среди всех фото, разница только в том, что идентификаторы. Pic код

#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(); 
    } 
} 

Я попытался удалить clear_usart_receiver(); из моего кода pic, тогда, когда pic отвечает, следующий не будет, следующий печатает как запланировано, следующее также ничего не печатает и так далее.

+0

Как вы мультиплексируете эту последовательную связь? вы можете загрузить блок-схему или схему схемы ...? –

+0

", когда я отправляю из rpi адрес, который не существует в pics, никто не отвечает на rpi" Разве это не по спецификации? Если вы попытаетесь найти что-то, чего не существует, ваша система неправильно сконфигурирована. – Lundin

ответ

0

Одна очевидная проблема заключается в том, что отправка 10 байтов данных по UART с 9600 занимает больше 10 мс. Вы не должны использовать некоторую задержку ожидания с задержкой на дому, но вместо этого опросите флаг UART rx в цикле.

1 байт данных = 1 стартовый бит, 8 бит данных, 1 стоп-бит (без partity, 1 стоп-бит) не = 10 бит

Она занимает 9600^-1 нам послать один бит.

9600^-1 * 10 бит * 10 байт = 10.42ms лучший сценарий

0

На стороне ПОС, fgets() ожидает CR характера, но вы не отправите его от RPI. Другой проблемой является, вероятно,

while (serial.available()> 0) { data = serial.read(); }

Мне кажется, что вы держите на перезапись переменную data.

 Смежные вопросы

  • Нет связанных вопросов^_^