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 мс в лучшем случае