Ubuntu 系统下java rxtx 开发串口通讯程序

本文介绍在Ubuntu系统中使用Java RXTX库进行串口通讯的开发方法。包括如何获取可用串口列表、设置串口监听器、配置串口通讯参数及读取数据等关键步骤。适用于希望在Linux环境下实现串口数据交互的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近做了Ubuntu系统下关于Java Rxtx 串口开发的项目,对于Rxtx有一些经验和大家分享一下。 获取系统可用串口,可以设置屏蔽掉ttyUSB0-ttyUSB3(因为可能被系统占用,也可以不屏蔽).开发主要针对USB-SerialPort,直接是串口的话,将ttyUSB修改为ttyS。

 

                 /**
		 * 列出可用串口列表
		 * @return
		 */
		public String getAvailableSerialPortsName() {
                               String ttyUSB = null;
				@SuppressWarnings("rawtypes")
				Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();
		                     while (thePorts.hasMoreElements()) {
					CommPortIdentifier com = (CommPortIdentifier) thePorts.nextElement();
					switch (com.getPortType()) {
					case CommPortIdentifier.PORT_SERIAL:
						CommPort thePort = null;
						try {//过滤COM1-3
							thePort = com.open("CommUtil", 2000);
							if (!Pattern.compile("ttyUSB[0-3]\\b").matcher(com.getName()).matches()) {								
								ttyUSB = com.getName();
							}
						} catch (PortInUseException e) {
							e.printStackTrace();						
						} catch (Exception e) {
							System.out.println("Failed to open port " + com.getName());
						} finally {
							if (thePort != null) {
								thePort.close();
							}
						}
					}
				}
				return ttyUSB;
			}


进行监听获取到的需要通讯的串口,其中ttyUSB为需要打开的串口/dev/ttyUSB(在windows下使用,只要将ttyUSB换成COM)。

 

 

 

 

        /** 检测系统中可用的通讯端口类 */
	static CommPortIdentifier portId;
	/** Enumeration 为枚举型类,在java.util中 */
	@SuppressWarnings("rawtypes")
	static Enumeration portList;
	InputStream inputStream; 
	/** 声明RS-232串行端口的成员变量 */
	SerialPort serialPort;
	OutputStream outputStream;
	/**
	 * 点击按扭所触发的事件:打开串口,并监听串口.
         * @author Luckyion
         */
	public void actionPerformed(String ttyUSB)
	{
		/**获取系统中所有的通讯端口 */
		portList=CommPortIdentifier.getPortIdentifiers();
		/** 用循环结构找出串口 */
		while (portList.hasMoreElements()){
			/**强制转换为通讯端口类型*/
			portId=(CommPortIdentifier)portList.nextElement();
			if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){
				//USB串口1
				if (portId.getName().equals(ttyUSB)) {
					try {
						serialPort = (SerialPort) portId.open("ReadComm", 2000);
						/**设置串口监听器*/
						serialPort.addEventListener(this);
						/** 侦听到串口有数据,触发串口事件*/	
						serialPort.notifyOnDataAvailable(true);
					}
					catch (PortInUseException e) {
						e.printStackTrace();
					}					
					catch (TooManyListenersException e) { 
						e.printStackTrace();
					}
									
				}
				//if end
			} //if end
		} //while end
	} //actionPerformed() end

       打开串口后,就可以通过串口和串口设备进行通讯了。

 

 

        /**
	 * 串口监听器触发的事件,设置串口通讯参数,读取数据
	 * @author Luckyion
	 */
	public void serialEvent(SerialPortEvent event) {
		/**设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/
		try { 
			serialPort.setSerialPortParams(9600,
					SerialPort.DATABITS_8,
					SerialPort.STOPBITS_1,
					SerialPort.PARITY_NONE);
		}
		catch (UnsupportedCommOperationException e) {
			e.printStackTrace();
		}
		try {
				inputStream = serialPort.getInputStream();
			}
			catch (IOException e) {
				e.printStackTrace();
			}
			try {
				switch(event.getEventType())
				{
					case SerialPortEvent.BI:
					case SerialPortEvent.OE:
					case SerialPortEvent.FE:
					case SerialPortEvent.PE:
					case SerialPortEvent.CD:
					case SerialPortEvent.CTS:
					case SerialPortEvent.DSR:
					case SerialPortEvent.RI:
					case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
						break;
					case SerialPortEvent.DATA_AVAILABLE:
						/** 从线路上读取数据流 */
						//String bytess="";
						while (inputStream.available() > 0) {
							int numBytes = inputStream.read();
            		} //while end					      		
		    }
		}
		catch (IOException e) { 
			e.printStackTrace();
		}
	} 

        若要进行串口写操作,使用SerialOutputStream。

 

 

/**
	 * 写入串口数据
	 * @author Luckyion
	 */
	protected void writes(byte[] b){
		try {
			outputStream = serialPort.getOutputStream();
			outputStream.write(b);
			outputStream.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

刚开始学着写博客,写的不好,请大家谅解哈。

 

 

 

 

 

 

 

 

 

 

### 配置和使用 Ubuntu 系统上的串行端口 #### 导入 pyserial 库并创建串口对象 为了在 Python 中操作串行端口,在安装 `pyserial` 后需先导入该库,并指定要使用的设备路径以及波特率来初始化一个串口实例。 ```python import serial # 导入库 ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) # 创建串口对象,设置端口号、波特率为9600及超时时间[^1] ``` #### 检查 USB 设备连接状态 当 STM32 或其他微控制器与 Linux 开发板通过 USB 连接后,可以利用命令查看是否有新的 ttyUSB 类型文件被识别出来: ```bash ls -l /dev/ttyUSB* ``` 这条指令会列出所有已挂载的 USB 串行接口。如果一切正常,则应该能看到类似 `/dev/ttyUSB0` 的条目表示硬件已被成功检测到[^2]。 #### 处理权限不足错误 有时可能会遇到由于缺少适当权限而无法访问特定串行端口的情况,比如下面这个异常提示: > SerialException: [Errno 13] could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0' 针对此类问题,可以通过修改用户组的方式赋予当前登录账户足够的读写权限给目标设备节点。具体做法如下所示: ```bash sudo usermod -aG dialout $USER # 将自己加入dialout组以便获得相应权限 newgrp dialout # 刷新组成员资格使更改立即生效 ``` 完成上述步骤之后重新尝试打开串口即可解决因权限引起的报错情况。 #### 枚举可用通信端口(Java 示例) 对于 Java 编程环境而言,可采用 RXTX 库来进行串行通讯编程工作。这里给出一段用于枚举系统中存在的 COM 口资源代码片段作为参考: ```java Enumeration portIdentifiers = CommPortIdentifier.getPortIdentifiers(); // 获取所有端口标识符列表[^3] while (portIdentifiers.hasMoreElements()) { CommPortIdentifier portId = (CommPortIdentifier) portIdentifiers.nextElement(); System.out.println(portId.getName()); } ``` 请注意这段程序适用于那些基于 JVM 的应用程序开发场景下查找本地计算机上存在的物理或虚拟串行端口名称之用途。 #### 提供正确的命令行参数 某些情况下可能还需要向执行脚本传递额外的信息以指明具体的串行端口位置。例如 C/C++ 程序中经常会出现这样的提示信息提醒使用者输入必要的启动选项: ```c printf("Please start with %s /dev/ttyS1 (for example)\n", argv[0]); // 建议提供完整的绝对路径名指向实际存在的TTY设备文件[^4] ``` 这意呈着开发者应当确保所提供的命令行参数能够准确无误地映射至真实的硬件实体之上。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值