chenyc
2025-01-24 fe2618c213d59d2fe3cbef757cfe593ba46a56e5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
const SerialPort = require('serialport');
 
// 设置重连间隔和最大重试次数
const RECONNECT_INTERVAL = 10000; // 重连间隔10秒
const MAX_RECONNECT_ATTEMPTS = 10; // 最大重试次数10次
 
let reconnectAttempts = 0; // 当前重试次数
let serialPort:any; // 串口实例
 
const initPort=(portName:string,baudRate:Number)=>{
  if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
    console.error('重试次数达到上限,不再尝试重连。');
    return;
  }
 
  if (serialPort && serialPort.isOpen) {
    console.log('串口已打开,不再重复打开。');
    return;
  }
 
  try {
    serialPort = new SerialPort(portName,baudRate, { autoOpen: false }); // 创建串口实例
 
    serialPort.open((err:any) => {
      if (err) {
        console.error('串口打开失败:', err.message);
        setTimeout(initPort, RECONNECT_INTERVAL, portName);
        reconnectAttempts++;
        return;
      }
 
      console.log('串口已成功打开。');
      reconnectAttempts = 0; // 重置重试次数
 
      // 这里可以添加数据接收处理逻辑
      serialPort.on('data', (data:any) => {
        console.log('接收到数据:', data);
      });
 
      // 处理错误
      serialPort.on('error', (error:any) => {
        console.error('发生错误:', error.message);
        serialPort.close(); // 关闭串口
        setTimeout(connectSerialPort, RECONNECT_INTERVAL, portName); // 重连
      });
 
      // 处理关闭事件
      serialPort.on('close', () => {
        console.log('串口已关闭,将在5秒后尝试重新连接。');
        setTimeout(initPort, RECONNECT_INTERVAL, portName); // 重连
      });
    });
  } catch (error) {
    console.error('无法创建串口实例:', error.message);
    setTimeout(initPort, RECONNECT_INTERVAL, portName);
  }
}
 
// 调用connectSerialPort函数尝试连接串口,例如:
// connectSerialPort('/dev/ttyUSB0');