`
walsece
  • 浏览: 138392 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

通过串口让普通的电路开关控制你的java程序

阅读更多

注:本文为原创文章,转载时请注明转载地址。


在上篇文章中介绍了通过串口向LED液晶显示屏发送数据的方式,同样,通过串口也可以让你的程序来捕捉外部设备(开关类设备)触发的事件或者从外部设备读取数据(传感器等)。 下面介绍一个通过脚踏开关来控制应用程序操作的例子。

脚踏开关—分为两种:一种就是日常生活中最普通的电路开关,通过电路的闭合来控制 电路的接通;另一种就是在开关中加入一个上位机,其他的都一样。

功能:当脚踏开关踩下(电路接通)时,触发你的程序中的一个动作,比如启动/停止一项任务。

接线图:
将开关的两根线分别接在串口的输入、输出(2、3号)引脚,如图:


根据脚踏开关的两种类型采用不同的方式

1.带上位机的
该方式比较简单,当开关的闭合触发事件时上位机会通过串口向pc发送数据,在程序中采用串口的事件监听模型即可进行事件的捕捉,主要代码如下:

try { 
serialPort.addEventListener(new SerialPortEventListener() { 
public void serialEvent(SerialPortEvent serialPortEvent) { 
//在此进行事件捕捉处理 
} 
}); 
} catch (TooManyListenersException e) { 
serialPort.close(); 
throw new SerialConnectionException("too many listeners added"); 
} 

 



2.普通的开关
此种方式由于没有上位机主动向pc发送数据,所以不能再采用上述方式来进行捕获事件,解决的方式是:让一个单独的线程每隔一定的时间向串口发送数据,然后让另一个线程不停的在串口接收数据,如果能够接受到数据说明开关闭合,否则说明开关断开。

相关程序代码:

public class Demo {
    static SwitchControl control;
    private InputStream in;
    private OutputStream os;
    private SerialPort serialPort;
    boolean inited = false;
    boolean stoped = false;
    long beg = System.currentTimeMillis();

    public boolean init() {
        if (inited) {
            return true;
        }
        try {
            CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM1");
            serialPort = (SerialPort) portId.open("SerialBean", 4000);
            serialPort.setSerialPortParams(9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
            serialPort.setDTR(true);
            in = serialPort.getInputStream();
            os = serialPort.getOutputStream();
            inited = true;
           
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }


        return true;
    }


    public void writePort(int s) {
        try {
            os.write(s);
            os.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void start() {
        Thread send = new Thread(new SendData());
        Thread recive = new Thread(new ReceiveData());
        send.start();
        recive.start();
    }


    public void close() {
        stoped = true;
        try {
            Thread.sleep(20);
            if (in != null) {
                in.close();
            }

            if (os != null) {
                os.close();
            }
            if (serialPort != null)
                serialPort.close();


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

    class ReceiveData implements Runnable {

        public void run() {
            while (true) {
                if (stoped) {
                    break;
                }
                byte[] b = new byte[10];
                try {
                    if (in.read(b) == 0) {
                        continue;
                    }
                    long end = System.currentTimeMillis();
                    //处去噪声影响,通过连续两次接受到数据的时间差来判断是一次长时间的踩踏还是连续2次或者多次踩踏
                    if (end - beg > 20) {
                        Thread tt = new Thread(new Task());
                        tt.start();
                    }
                    Thread.sleep(10);
                    beg = System.currentTimeMillis();
                } catch (Exception e) {
                    break;
                }

            }
        }
    }

    class SendData implements Runnable {
        public void run() {
            while (true) {
                if (stoped) {
                    break;
                }
                writePort(0);
                try {
                    Thread.sleep(5);
                } catch (Exception e) {
                    e.printStackTrace();
                    break;
                }
            }
        }
    }

    class Task implements Runnable {

        public void run() {
            // 相关任务
            System.out.println("捕捉到事件.............");
        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        if (!demo.init()) {
            System.err.println("初始化串口失败!");
            return;
        }

        demo.start();
    }
}

 

 

12
3
分享到:
评论
4 楼 walsece 2008-05-09  
慢慢淘汰并不代表无用武之地,只不过你不经常接触相应的行业而已,其实现在很多方面都还在用com,这是我在做软件中遇到的实实在在的需求,虽然目前大部分都在使用usb,但是从编程的角度而言两者之间没有太大的区别。
3 楼 Unmi 2008-05-08  
我们要创新,但是要有价值的创新

就说这东西的实际意义在哪里,现在PC上在慢慢淘汰 COM,某些仪器设备保留下来。
2 楼 yangyiqian 2008-05-06  
好东东,顶!
1 楼 mlhorizon 2008-05-06  
还是带点编码解码的好!!
防止干扰,同时能实现的功能也多一点!!

相关推荐

    JAVA控制USB串口继电器例程源码,16进制指令控制开关

    本示例中的"JAVA控制USB串口继电器例程源码"提供了一个具体的解决方案,允许开发者使用Java语言通过USB串口发送16进制指令来控制继电器开关。这一技术在自动化、远程控制、智能家居等领域有着广泛的应用。 首先,...

    串口通信控制LED

    通过计算机或单片机的串行接口与LED驱动电路进行数据交换,实现对LED灯亮度、颜色或者开关状态的远程控制。下面将详细阐述串口通信的基本原理、LED控制方法以及涉及到的相关技术。 串口通信,又称串行通信,是数据...

    WindowsApplication1.rar_C# 操作继电器_Java控制继电器_开关按钮

    开发者会创建一个Java程序,通过读写串口数据,向继电器发送控制指令。Java程序可能包括设置串口参数、打开串口、发送控制继电器的命令(如ON/OFF)以及接收反馈信息等步骤。 "开关按钮"这一标签暗示了用户界面(UI)...

    蓝牙控制继电器开关程序

    继电器是一种电磁开关,通常用于在电路中隔离高电压或大电流部分,而蓝牙模块则提供无线通信功能,使用户能够通过智能手机或其他蓝牙设备远程控制电路。 【描述】:“程序可以直接使用 也可以参照程序更改为stm32...

    武汉亚为8J串口采集卡YMS例程教学

    2. **继电器功能**:该设备内置8路继电器,可以实现对电路的远程开关控制。继电器是一种电磁开关,通过电信号控制物理开关,常用于切换高电压或大电流的电路,确保操作安全。 3. **多种通信接口**:亚为8J提供RS232...

    基于ZigBee的无线数据采集系统.pdf

    PC端的Java程序通过串口向ZigBee节点A发送命令,ZigBee节点A将命令转发给ZigBee节点B,ZigBee节点B接收到命令后控制电子开关的状态。 系统实现 系统的实现主要包括硬件的设计和制作、软件的开发和测试。硬件的设计...

    单片机上位机

    在这个交通灯系统中,上位机可能是用C#、Java、Python等编程语言开发的一个应用程序,它具备用户友好的图形界面,允许操作员设置交通灯的运行模式,如红绿黄灯的时序、紧急情况下的信号切换等。 交通灯上位机与...

    手机蓝牙控制板资料和手机软件

    3. **串口发送控制继电器开关**:这可能是一个程序或脚本,用于通过串行通信接口发送控制继电器的指令。在PC上,这可能使用Python、C++或其他编程语言实现,通过串口(如USB转串口)连接到蓝牙控制板。这个程序可能...

    arduino蓝牙开关

    在本文中,我们将深入探讨...总结来说,"arduino蓝牙开关"项目涉及Arduino编程、蓝牙通信、继电器控制和Android应用程序开发等多个方面。通过学习和实践这个项目,你可以掌握基本的物联网技能,同时享受创新的乐趣。

    基于机智云平台的智能电灯控制系统设计.pdf

    - **下位机设计**:下位机采用STM32微控制器作为核心,负责电灯的开关控制。STM32芯片具有高性能、低功耗的特点。通过WiFi模块,下位机与上位机APP进行数据交互,实现远程控制。 - **上位机设计**:上位机即用户端...

    物联网应用系统设计.docx

    在本例中,上位机可能使用VC++编写,通过串口与下位机通信,控制智能家居设备,如LED灯的开关。下位机通常采用微控制器,如CC2530芯片,这是一种集成RF通信和微控制器功能的芯片,适合于构建ZigBee网络。 设计过程...

    基于安卓和ESP8266的室内灯光控制器设计.zip

    1. 物理层接口:ESP8266通常采用AT命令集进行编程,通过串口接收安卓设备发送的指令,并通过GPIO引脚控制灯具。使用Arduino IDE或MicroPython等开发环境进行编程。 2. Wi-Fi配置:ESP8266需要配置为Wi-Fi客户端模式...

    基于STC89C52单片机的智能家居控制系统设计.docx

    系统可以通过继电器模块控制灯光的开关以及亮度调节。用户可以选择手动调节或是设置预设模式,如“阅读”、“睡眠”等模式。 ##### 光线控制 系统能够根据室内光照强度自动调整窗帘开合程度,确保室内光线适宜,...

    基于单片机的家电远程控制系统设计.pdf

    用户可以通过打电话的方式,通过特定的电话网络对家电进行开关控制或者状态监测。随着移动通信技术的发展,移动电话也被广泛应用于家电远程控制系统中。 在设计家电远程控制系统时,需要考虑系统的硬件组成和软件...

    基于单片机控制的智能开闭窗系统设计.rar

    上位机应用程序可实现远程监控和参数设置,常用语言有C#、Java等,通过串口、蓝牙或Wi-Fi与单片机通信。 四、系统功能实现 1. 自动控制:依据光照强度、温度、湿度和风速等参数,自动调节窗户开闭,提高室内环境...

    基于单片机系统的手机蓝牙智能锁设计.pdf

    在本文中,开发者使用Eclipse作为集成开发环境,采用JAVA语言编写了能够控制蓝牙智能锁的手机应用程序。该程序通过蓝牙与智能锁建立连接并发送开关锁的指令。一个优秀的手机APP不仅需要功能完备,还要有良好的用户...

    电子信息工程专业方向.pdf

    数字电子线路方向主要涉及单片机(8位的8051系列、32位的ARM系列等)、FPGA(CPLD)、数字逻辑电路、微机接口(串口、并口、USB、PCI)的开发,以及驱动程序和底层应用程序的编写。这一方向需要熟悉C语言和汇编语言...

    28open LED 灯亮.rar

    4. **软件开发**:在PC端,可能需要编写一个简单的控制程序,例如用C#、Python或Java,用于发送"open"和"close"字符串到KL25。而在KL25端,需要编程实现串口接收、解析指令并控制GPIO(通用输入/输出)的功能。这...

    自考电子信息工程专业就业方向及就业前景分析.docx

    数字电子线路方向作为一个热门的就业方向,主要从事单片机(8 位的 8051 系列、32 位的 ARM 系列等等)、FPGA(CPLD)、数字逻辑电路、微机接口(串口、并口、USB、PCI)的开发,更高的要求会写驱动程序、会写底层...

Global site tag (gtag.js) - Google Analytics