美文网首页
树莓派 3 java usb串口通讯485

树莓派 3 java usb串口通讯485

作者: 格林哈 | 来源:发表于2020-01-06 11:18 被阅读0次

0 参考链接

https://blog.csdn.net/qq_43725844/article/details/97682424
https://blog.csdn.net/fhqlongteng/article/details/80417028
https://pi4j.com/1.2/example/serial.html
https://www.jianshu.com/p/767fd1fbcaae
https://blog.csdn.net/qq_38839677/article/details/80618411
https://www.cnblogs.com/uestcman/p/9074737.html

1 环境装备

1.1 硬件准备

  • 1,树莓派 2,一跟串口转485的数据线
    树莓派usb串口连接 数据线, 485头连传感器设备。

  • 2 命令调试

//可出现所有的串口
lsusb
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 004: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC
    Bus 001 Device 003: ID 1a2c:2c27 China Resource Semico Co., Ltd
    Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
//看到了识别成了ttyUSB0 
ls -l /dev/tty* 
    crw--w---- 1 root tty       4,  9 Jan  3 09:17 /dev/tty9
    crw-rw---- 1 root dialout 204, 64 Jan  6 01:40 /dev/ttyAMA0
    crw------- 1 root root      5,  3 Jan  3 09:17 /dev/ttyprintk
    crw--w---- 1 root tty       4, 64 Jan  6 01:40 /dev/ttyS0
    crw-rw---- 1 root dialout 188,  0 Jan  6 02:59 /dev/ttyUSB0
//查看串口的波特率
stty -F /dev/ttyUSB0
    speed 9600 baud; line = 0;
    min = 0; time = 100;
    -brkint -icrnl -imaxbel
    -opost
    -isig -icanon -iexten -echo -echoe
//查看串口的连接信息
dmesg | grep ttyUSB0
    [    6.621718] usb 1-1.4: FTDI USB Serial Device converter now attached to ttyUSB0

#保证 python 和pyserial 安装了。 树莓派4B
// 安装 pyserial
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
// 校验
gpio -v


pip list
//命令python查看安装到系统上的串口
python -m serial.tools.list_ports
// pyhon 调试
python
import serial
ser=serial.Serial('/dev/ttyUSB0',9600) #/dev/ttyUSB0 根据实际修改 波特率 根据传感器修改
ser.write('12345'.encode())


1.2 java代码

//确定 串口号/dev/ttyUSB0

package com.weepal.utils;// START SNIPPET: serial-snippet


import com.pi4j.io.serial.*;
import com.pi4j.util.CommandArgumentParser;
import com.pi4j.util.Console;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.util.Date;
public class SerialExample {
    static final Logger log = LoggerFactory.getLogger(SerialExample.class);   //日志
    final static Serial serial = SerialFactory.createInstance();

    /**
     * This example program supports the following optional command arguments/options:
     *   "--device (device-path)"                   [DEFAULT: /dev/ttyAMA0]
     *   "--baud (baud-rate)"                       [DEFAULT: 38400]
     *   "--data-bits (5|6|7|8)"                    [DEFAULT: 8]
     *   "--parity (none|odd|even)"                 [DEFAULT: none]
     *   "--stop-bits (1|2)"                        [DEFAULT: 1]
     *   "--flow-control (none|hardware|software)"  [DEFAULT: none]
     *
     * @param args
     * @throws InterruptedException
     * @throws IOException
     */
    public static void main(String args[]) throws InterruptedException, IOException {
        try {

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

            if(args.length > 0){
                config = CommandArgumentParser.getSerialConfig(config, args);
            }


            serial.open(config);


            serial.addListener(new SerialDataEventListener() {
                @Override
                public void dataReceived(SerialDataEvent event) {


                    try {
                        System.out.println("[HEX DATA]   " + event.getHexByteString());
                        System.out.println("[ASCII DATA] " + event.getAsciiString());

                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });

            // continuous loop to keep the program running until the user terminates the program
            while(true) {
                try {
                    String order = "010300000001";
                    byte[] sbuf = CRC16MUtils.getSendBuf(order);
                    String requestStr = CRC16MUtils.getBufHexStr(sbuf);
                    serial.write(HexUtils.hexStringTobyte(requestStr));
                    System.out.println("write 010300000001" );
                }
                catch(IllegalStateException ex){
                    ex.printStackTrace();
                }

                Thread.sleep(1000 * 60 *5);
            }

        }
        catch(IOException ex) {
            System.out.println(" ==>> SERIAL SETUP FAILED : " + ex.getMessage());
            return;
        }
    }


}

// 代码结果
write 010300000001
[HEX DATA]   01,03,02,00,27,F8,5E




1.3 常见问题解决

  • /dev/ttyS0: Permission denied
1方法一 永久有效
//树莓派4B
vim /boot/cmdline.txt
// 注释 console-serial,115200
sudo vi /boot/cmdline.txt
// 添加 enable_uart=1
sudo vi /boot/config.tx
// 开启 uart接口 关闭shell访问,打开硬件串口
sudo raspi-config
    //选择Interfacing Options -> Serial -> Yes
// 重启
sudo reboot

//权限问题
groups ${USER}
sudo gpasswd --add ${USER} dialout

2方法二 临时有效
    chmod 660 /dev/ttyS0

相关文章

网友评论

      本文标题:树莓派 3 java usb串口通讯485

      本文链接:https://www.haomeiwen.com/subject/olohactx.html