【串口通信】之案例参考

查阅网上资料借鉴了两篇博文其一点击打开链接其二点击打开链接

总结有两点:

SerialTool.java串口服务类,功能有查找所有可用端口,打开串口,关闭串口,读取串口数据(将接收到的数据根据需求解析),向串口发送数据,添加监听器。

package serialPort;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import serialException.*;

/**
 * 串口服务类,提供打开、关闭串口,读取、发送串口数据等服务(采用单例设计模式)
 * @author zhong
 *
 */
public class SerialTool {
	
	private static SerialTool serialTool = null;
	
	static {
		//在该类被ClassLoader加载时就初始化一个SerialTool对象
		if (serialTool == null) {
			serialTool = new SerialTool();
		}
	}
	
	//私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象
	private SerialTool() {}	
	
	/**
	 * 获取提供服务的SerialTool对象
	 * @return serialTool
	 */
	public static SerialTool getSerialTool() {
		if (serialTool == null) {
			serialTool = new SerialTool();
		}
		return serialTool;
	}


	/**
	 * 查找所有可用端口
	 * @return 可用端口名称列表
	 */
	public static final ArrayList<String> findPort() {

		//获得当前所有可用串口
        Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();	
        
        ArrayList<String> portNameList = new ArrayList<>();

        //将可用串口名添加到List并返回该List
        while (portList.hasMoreElements()) {
            String portName = portList.nextElement().getName();
            portNameList.add(portName);
        }

        return portNameList;

    }
    
    /**
     * 打开串口
     * @param portName 端口名称
     * @param baudrate 波特率
     * @return 串口对象
     * @throws SerialPortParameterFailure 设置串口参数失败
     * @throws NotASerialPort 端口指向设备不是串口类型
     * @throws NoSuchPort 没有该端口对应的串口设备
     * @throws PortInUse 端口已被占用
     */
    public static final SerialPort openPort(String portName, int baudrate) throws SerialPortParameterFailure, NotASerialPort, NoSuchPort, PortInUse {

        try {

            //通过端口名识别端口
            CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

            //打开端口,并给端口名字和一个timeout(打开操作的超时时间)
            CommPort commPort = portIdentifier.open(portName, 2000);

            //判断是不是串口
            if (commPort instanceof SerialPort) {
            	
                SerialPort serialPort = (SerialPort) commPort;
                
                try {                    	
                    //设置一下串口的波特率等参数
                    serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);                              
                } catch (UnsupportedCommOperationException e) {  
                	throw new SerialPortParameterFailure();
                }
                
                //System.out.println("Open " + portName + " sucessfully !");
                return serialPort;
            
            }        
            else {
            	//不是串口
            	throw new NotASerialPort();
            }
        } catch (NoSuchPortException e1) {
          throw new NoSuchPort();
        } catch (PortInUseException e2) {
        	throw new PortInUse();
        }
    }
    
    /**
     * 关闭串口
     * @param serialport 待关闭的串口对象
     */
    public static void closePort(SerialPort serialPort) {
    	if (serialPort != null) {
    		serialPort.close();
    		serialPort = null;
    	}
    }
    
    /**
     * 往串口发送数据
     * @param serialPort 串口对象
     * @param order	待发送数据
     * @throws SendDataToSerialPortFailure 向串口发送数据失败
     * @throws SerialPortOutputStreamCloseFailure 关闭串口对象的输出流出错
     */
    public static void sendToPort(SerialPort serialPort, byte[] order) throws SendDataToSerialPortFailure, SerialPortOutputStreamCloseFailure {

    	OutputStream out = null;
    	
        try {
        	
            out = serialPort.getOutputStream();
            out.write(order);
            out.flush();
            
        } catch (IOException e) {
        	throw new SendDataToSerialPortFailure();
        } finally {
        	try {
        		if (out != null) {
        			out.close();
        			out = null;
        		}				
			} catch (IOException e) {
				throw new SerialPortOutputStreamCloseFailure();
			}
        }
        
    }
    
    /**
     * 从串口读取数据
     * @param serialPort 当前已建立连接的SerialPort对象
     * @return 读取到的数据
     * @throws ReadDataFromSerialPortFailure 从串口读取数据时出错
     * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错
     */
    public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure {

    	InputStream in = null;
        byte[] bytes = null;

        try {
        	
        	in = serialPort.getInputStream();
        	int bufflenth = in.available();		//获取buffer里的数据长度
            
        	while (bufflenth != 0) {                             
                bytes = new byte[bufflenth];	//初始化byte数组为buffer中数据的长度
                in.read(bytes);
                bufflenth = in.available();
        	} 
        } catch (IOException e) {
        	throw new ReadDataFromSerialPortFailure();
        } finally {
        	try {
            	if (in != null) {
            		in.close();
            		in = null;
            	}
        	} catch(IOException e) {
        		throw new SerialPortInputStreamCloseFailure();
        	}

        }

        return bytes;

    }
    
    /**
     * 添加监听器
     * @param port     串口对象
     * @param listener 串口监听器
     * @throws TooManyListeners 监听类对象过多
     */
    public static void addListener(SerialPort port, SerialPortEventListener listener) throws TooManyListeners {

        try {
        	
            //给串口添加监听器
            port.addEventListener(listener);
            //设置当有数据到达时唤醒监听接收线程
            port.notifyOnDataAvailable(true);
          //设置当通信中断时唤醒中断线程
            port.notifyOnBreakInterrupt(true);

        } catch (TooManyListenersException e) {
        	throw new TooManyListeners();
        }
    }
    
    
}

从面板获取串口 波特率 打开串口

//获取串口名称
				String commName = commChoice.getSelectedItem();			
				//获取波特率
				String bpsStr = bpsChoice.getSelectedItem();
				
				//检查串口名称是否获取正确
				if (commName == null || commName.equals("")) {
					JOptionPane.showMessageDialog(null, "没有搜索到有效串口!", "错误", JOptionPane.INFORMATION_MESSAGE);			
				}
				else {
					//检查波特率是否获取正确
					if (bpsStr == null || bpsStr.equals("")) {
						JOptionPane.showMessageDialog(null, "波特率获取错误!", "错误", JOptionPane.INFORMATION_MESSAGE);
					}
					else {
						//串口名、波特率均获取正确时
						int bps = Integer.parseInt(bpsStr);
						try {
							
							//获取指定端口名及波特率的串口对象
							serialPort = SerialTool.openPort(commName, bps);
							//在该串口对象上添加监听器
							SerialTool.addListener(serialPort, new SerialListener());
							//监听成功进行提示
							JOptionPane.showMessageDialog(null, "监听成功,稍后将显示监测数据!", "提示", JOptionPane.INFORMATION_MESSAGE);
							
						} catch (SerialPortParameterFailure | NotASerialPort | NoSuchPort | PortInUse | TooManyListeners e1) {
							//发生错误时使用一个Dialog提示具体的错误信息
							JOptionPane.showMessageDialog(null, e1, "错误", JOptionPane.INFORMATION_MESSAGE);
						}
					}
				}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Visual C串口通信技术详解PDF》是一本介绍使用Visual C语言进行串口通信技术的详细教程。本书详细讲解了利用Visual C语言进行串口通信的原理、步骤和常用函数库。 串口通信是指通过串行接口进行数据传输的通信方式。在计算机和嵌入式系统中,串口通信被广泛应用于设备间的数据交互。本书从基础概念入手,首先介绍了串口通信的原理和基本知识,包括串口通信协议、数据位、校验位、停止位等。 然后,本书详细介绍了使用Visual C语言进行串口通信的步骤和方法。首先是配置串口参数,包括波特率、数据位、校验位等。然后是打开串口,并设置串口的工作模式和缓冲区大小。接下来是发送数据和接收数据的操作,包括发送和接收字符串、发送和接收二进制数据等。 本书还介绍了常用的串口通信函数库,包括Windows API函数和自定义函数库。通过这些函数库,开发者可以简化串口通信的操作,提高开发效率。 此外,本书还通过实例演示了如何使用Visual C语言进行串口通信的开发。通过实际的代码示例,读者可以更好地理解串口通信的原理和实践技巧。 总的来说,《Visual C串口通信技术详解PDF》是一本全面而深入的教程,对于想要学习和应用Visual C语言进行串口通信的开发者来说,是一本难得的参考资料。建议读者在学习本书时具备一定的Visual C语言基础,以便更好地理解和运用书中的内容。 ### 回答2: 《Visual C 串口通信技术详解.pdf》是一本介绍Visual C编程语言中串口通信技术的详细解说的电子书。串口通信是计算机与外部设备之间通过串口进行数据传输的一种通信方式。串口通信在很多应用领域中都得到了广泛应用,比如嵌入式系统、物联网等。 该电子书主要包含以下内容:首先,它会介绍Visual C编程语言的基础知识,包括语法、变量类型等。了解Visual C编程语言的基础知识是学习串口通信的前提。 其次,它会详细讲解串口通信的原理和技术细节。包括串口通信的基本概念,如波特率、数据位、停止位等,以及如何通过Visual C编程实现串口的开启、关闭和配置。同时还会介绍如何使用Visual C编程语言进行串口数据的读写操作,并提供相关的代码示例和案例分析。 此外,该电子书还会介绍常见的串口通信协议,比如RS-232、RS-485等,并说明它们之间的区别和适用场景。同时,它还会探讨如何利用Visual C编程语言实现串口通信的错误检测和纠错机制,以确保数据传输的可靠性。 总之,该电子书提供了一份详细的Visual C编程语言中串口通信技术的指南,对于想要学习或者应用串口通信技术的开发人员来说,具有很高的参考价值。与其他通信方式相比,串口通信具有简单、稳定、成本低等优点,因此对于很多项目来说,串口通信都是一个有效的选择。 ### 回答3: 《Visual C 串口通信技术详解PDF》是一本关于使用Visual C编程语言进行串口通信的技术详解的电子书籍。本书主要针对使用Visual C进行串口通信的开发人员,提供了详细的指导和解释。 首先,本书介绍了串口通信的基本原理和概念。串口通信是通过串行传输方式进行数据传输的一种通信方式,相对于并行传输方式具有较高的稳定性和可靠性。本书详细介绍了串口通信的工作原理,包括数据传输速率、数据位、停止位和奇偶校验等相关概念。 其次,本书详细介绍了使用Visual C编程语言进行串口通信的具体步骤和方法。读者可以通过本书了解如何使用Visual C创建串口通信的相关程序,并实现数据的发送和接收功能。本书还提供了大量的示例代码和实例,以帮助读者更好地理解和掌握串口通信技术。 此外,本书还介绍了一些常见的串口通信问题和解决方法。例如,如何处理数据丢失、数据错误或通信超时等异常情况。本书给出了一些实用的技巧和建议,帮助读者解决实际应用中可能遇到的问题。 总体而言,《Visual C串口通信技术详解PDF》是一本深入浅出、详细全面的关于使用Visual C进行串口通信的技术指南。无论是初学者还是有一定经验的开发人员,都可以通过本书学习到有关串口通信的基本原理、编程方法以及应对常见问题的技巧。阅读本书将对使用Visual C进行串口通信的开发工作提供很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值