Mac下使用HidApi读取TRF7970A EVM遇DEVICE_ERROR及初始化失败问题
问题分析与解决方案
核心问题
你的设备是USB转UART桥控制器,对应/dev下的串口设备/dev/tty.usbserial-0001,但你错误地使用了HidApi(针对HID类设备的库)来操作它。HID和UART是完全不同的USB设备类别,HidApi无法识别和操作串口设备,这就是所有操作返回"Device not initialised"的原因。
解决步骤
1. 替换为串口通信库
放弃HidApi,使用专门的Java串口通信库,比如jSerialComm(无需额外依赖,配置简单)或RXTX。
2. jSerialComm示例代码
以下是适配你的设备的示例代码:
import com.fazecast.jSerialComm.SerialPort; import java.io.InputStream; public class TRF7970ASerialReader { public static void main(String[] args) { // 匹配你的串口设备路径 SerialPort serialPort = SerialPort.getCommPort("/dev/tty.usbserial-0001"); // 设置TRF7970A EVM的串口参数(需匹配开发板配置,常见为9600波特率) serialPort.setBaudRate(9600); serialPort.setNumDataBits(8); serialPort.setNumStopBits(1); serialPort.setParity(SerialPort.NO_PARITY); if (serialPort.openPort()) { System.out.println("串口打开成功"); // 设置读取超时 serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 1000, 0); try (InputStream in = serialPort.getInputStream()) { byte[] buffer = new byte[64]; int bytesRead = in.read(buffer); if (bytesRead > 0) { System.out.println("读取到数据:" + new String(buffer, 0, bytesRead)); } else { System.out.println("未读取到数据"); } } catch (Exception e) { e.printStackTrace(); } finally { serialPort.closePort(); } } else { System.out.println("无法打开串口,请检查权限或设备连接"); } } }
3. 前置准备
- 添加jSerialComm依赖到你的项目:
Maven依赖:<dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>2.9.0</version> </dependency> - 确认串口参数与TRF7970A EVM的配置一致(可参考开发板手册,通常波特率为9600或115200)。
4. 硬件连通性验证
在运行Java代码前,先用系统工具验证串口是否正常:
# 使用screen工具连接串口,测试是否能收到数据 screen /dev/tty.usbserial-0001 9600
如果screen能正常连接并收到开发板的数据,说明硬件和权限没问题,再运行Java代码即可。
补充说明
- 你之前执行的
sudo chmod -R 777 /dev/tty.usbserial-0001权限设置是有效的,但如果不想每次都手动修改,可以添加用户到uucp组:
重启后生效,无需再手动改权限。sudo usermod -aG uucp $USER
内容的提问来源于stack exchange,提问作者Koushik
相关产品推荐
相关产品推荐

