RPI с несколькими картинками по RS485 - CCS компилятор

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

На rpi я использую библиотеку pi4j java, в то время как на фото я пишу с помощью компилятора CCS.

Первая проблема заключается в том, что, когда я отправляю из rpi адрес, которого нет в изображениях, никто не отвечает на rpi, и изображение, которое я отправляю, это адрес в следующей инструкции, также не будет отвечать.

Код для RPI:

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;
        }
    }
}

Код на картинке является общим для всех фото, единственное отличие - идентификаторы.Пик код

#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(); из моего кода с изображением, затем, когда рис отвечает, следующий не будет, следующий печатает как запланировано, следующий также ничего не напечатает и так далее.

2 ответа

На стороне PIC функция fgets() ожидает символ CR, но вы не отправляете его из RPI. Другая проблема, вероятно,

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

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

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

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

Чтобы отправить один бит, нам нужно 9600^-1.

9600^-1 * 10 бит * 10 байт = 10,42 мс в лучшем случае

Другие вопросы по тегам