| | |
| | | ## data-acquisition |
| | | |
| | | 设备数据采集器 |
| | | 亨旺特导MES数据采集器 |
| | | |
| | | ### 串口采集(手动监听) |
| | | |
| | | 串口不再随项目启动自动监听,改为手动监听:调用采集接口时开启监听,采集结束后调用关闭接口。 |
| | | |
| | | | 接口 | 说明 | |
| | | | --- | --- | |
| | | | `GET /lims/getFile?fileExtension=.serialPort` | 采集接口:调用时自动开启监听,并返回本次采集到的数据;没有数据时返回空集合,由前端轮询取数 | |
| | | | `GET /lims/openSerialPort` | 手动开启监听,并返回当前接收到的数据列表(幂等,参数一致时复用已打开的串口) | |
| | | | `GET /lims/closeSerialPort` | 手动关闭监听(幂等,采集结束后调用,避免串口一直被占用) | |
| | | | `GET /lims/serialPortStatus` | 查询监听状态:`listenName` / `listening` / `portOpen` / `dataSize` | |
| | | |
| | | 串口参数全部由接口传入,`/lims/getFile`(`fileExtension=.serialPort` 时)和 `/lims/openSerialPort` 都支持, |
| | | 不传的字段使用默认值(`listenName` 必传)。application.yml 中的 `serialPort` 配置已不再生效,可以删除。 |
| | | |
| | | | 参数 | 默认值 | 说明 | |
| | | | --- | --- | --- | |
| | | | `listenName` | 必传 | 串口名称,如 `COM12`;不传会返回“串口名称不能为空” | |
| | | | `baudRate` | `9600` | 波特率 | |
| | | | `dataBits` | `8` | 数据位,5~8 | |
| | | | `stopBits` | `1` | 停止位,1、2、3(1.5 位) | |
| | | | `parity` | `NONE` | 校验位:`NONE`/`ODD`/`EVEN`/`MARK`/`SPACE`,也兼容 0~4 | |
| | | | `flowControl` | `NONE` | 流控:`NONE`/`RTS_CTS`/`XON_XOFF`,也兼容数字常量 | |
| | | | `readTimeout` | `1000` | 读取超时(毫秒) | |
| | | | `endMark` | `*` | 一帧数据的结束标志,特殊字符用 URL 编码,如换行 `%0A` | |
| | | | `maxCount` | `6` | 数据缓存队列长度:队列满时插入最新一条、移除最旧一条 | |
| | | | `frameIdleMillis` | `200` | 帧空闲补帧时间(毫秒):超过该时间没有新数据,就把缓冲区剩余数据当成一帧取出;`0` 表示关闭 | |
| | | |
| | | 示例:`/lims/getFile?fileExtension=.serialPort&listenName=COM12&baudRate=19200&parity=EVEN&endMark=%0A&maxCount=6` |
| | | |
| | | 参数与当前生效参数一致时复用已经打开的串口(不会重复打开);参数变化时会自动按新参数重新打开串口; |
| | | 参数非法时接口直接返回具体原因(如 `串口参数 dataBits 非法:9,取值范围 5~8`)。 |
| | | |
| | | 采集到的数据按队列缓存:插入最新的一条,超过 `maxCount` 条(默认 6 条)时移除最旧的一条, |
| | | 因此接口每次最多返回 `maxCount` 条最新的数据(按接收先后顺序);数据被取走后队列清空,重新开始缓存。 |
| | | |
| | | 数据帧按 `endMark` 切分。如果设备是「每帧以某个字符开头」而不是结尾(例如发 `*0 1 0`、`*0 2 0`, |
| | | `*` 用于分隔前后两帧),那么最后一帧后面没有新的 `*` 来触发切分,只靠结束标志会漏掉最后一条; |
| | | 此时由 `frameIdleMillis`(默认 200ms)兜底:串口空闲超过该时间后,把接收缓冲区里剩下的数据当作一帧取出。 |
| | | 如果设备每帧都以结束标志结尾,缓冲区每次切分后都是空的,空闲补帧不会做任何事。 |
| | | |
| | | 并发说明:开启 / 关闭串口由同一把锁保护,多线程并发调用采集接口也只会打开一次串口,不会重复注册监听器; |
| | | 采集结果存放在同步集合中,多线程同时取数时同一条数据只会被一个线程取走,不会重复也不会丢失。 |
| | | 调用关闭接口后再次调用采集接口会重新开启监听,并清掉上一轮残留的半包数据和未取走的数据,保证每次采集的数据只属于本轮。 |