Mac系统下如何使用Java读写串口设备?
在Mac上用Java正确操作串口设备的解决方案
你遇到的问题核心是:直接通过FileInputStream/FileReader访问串口设备时,没有配置串口通信的关键参数(波特率、数据位、停止位、奇偶校验等),导致设备无法正常响应。老旧的javax.comm库早已废弃且不支持现代Mac系统,推荐使用jSerialComm这个纯Java跨平台串口库来解决问题,它不需要额外配置本地依赖,对Mac支持友好。
具体实现步骤
1. 引入jSerialComm库
如果用Maven管理项目,在pom.xml中添加依赖:
<dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>2.9.2</version> <!-- 可使用最新稳定版本 --> </dependency>
如果是手动管理,直接从Maven仓库获取jar包放入项目类路径即可。
2. 编写串口操作代码
以下是和Python程序参数对齐的示例代码(确保波特率、校验位等参数和你的Python代码完全一致):
import com.fazecast.jSerialComm.SerialPort; import java.io.InputStream; import java.io.OutputStream; public class SerialDeviceHandler { public static void main(String[] args) { // 指定Mac上的串口设备路径,比如/dev/tty.usbmodem14101 SerialPort serialPort = SerialPort.getCommPort("/dev/your-device-name"); // 配置串口参数(和Python程序保持一致) serialPort.setBaudRate(9600); // 替换为你的波特率 serialPort.setNumDataBits(8); serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT); serialPort.setParity(SerialPort.NO_PARITY); serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED); // 打开串口 if (!serialPort.openPort()) { System.err.println("无法打开串口设备"); return; } try { // 获取输入输出流 InputStream in = serialPort.getInputStream(); OutputStream out = serialPort.getOutputStream(); // 示例:发送数据 out.write("Hello Serial".getBytes()); out.flush(); // 示例:读取数据 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { System.out.println("读取到数据:" + new String(buffer, 0, bytesRead)); } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭串口 serialPort.closePort(); } } }
3. 权限处理
Mac上/dev目录下的串口设备可能需要读写权限,你可以:
- 临时用
sudo运行Java程序,获取足够权限 - 永久将当前用户添加到
dialout组(部分Mac系统需要先创建该组):
之后重启终端或重新登录生效。sudo dscl . create /Groups/dialout sudo dscl . append /Groups/dialout GroupMembership $(whoami)
关键注意事项
- 必须确保Java代码中的串口参数(波特率、数据位等)和你的Python程序完全一致,否则通信会失败
- jSerialComm会自动识别Mac系统的串口设备,无需额外配置本地库
- 如果遇到设备无法识别的情况,可以调用
SerialPort.getCommPorts()获取所有可用串口,确认设备路径是否正确
内容的提问来源于stack exchange,提问作者Flarosa
相关产品推荐
相关产品推荐

