具有多个pics而不是rs485的RPI - CCS编译器

时间:2017-02-01 12:38:39

标签: java c pic raspberry-pi3 rs485

我正在尝试将rpi3视为主设备,将pic视为从设备,将rs485视为网络媒体。 rpi在slave的id上循环,它逐个发送它们,并等待指定slave(pic)的回复。 每张图片读取接收到的数据(地址)并将其与地址进行比较,如果是,则必须回复图片。

在rpi上我使用pi4j java库,而在图片上我用CCS编译器进行编码。

第一个问题是,当我从rpi发送图片中不存在的地址时,没有人回复rpi,而我在以下指令中发送它的地址也不会回复。

RPI的代码是:

cellIcon.image = UIImage(named: menuCell.cellIcon)

pic的代码在所有图片中很常见,唯一的区别是ID。 图片代码

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

我尝试删除clear_usart_receiver();从我的图片代码,然后当pic回复时,下一个不会,下一个按计划打印,以下将不会打印任何内容等等。

2 个答案:

答案 0 :(得分:0)

一个明显的问题是,使用9600通过UART发送10个字节的数据需要超过10毫秒。你不应该使用一些自制的死等待延迟,而是在循环中轮询UART rx标志。

1字节数据= 1个起始位,8个数据位,1个停止位(无参与,1个停止位)= 10位

发送一位需要9600 ^ -1 us。

9600 ^ -1 * 10bits * 10 bytes = 10.42ms最佳情况

答案 1 :(得分:0)

在PIC方面,fgets()等待CR字符但你不从RPI发送。另一个问题可能是

  

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

在我看来,你继续覆盖变量data