首页 > 解决方案 > 有没有办法查看蓝牙 SPP 扫描仪是否进入睡眠状态?

问题描述

我必须从蓝牙 SPP 扫描仪中获取条形码。我可以打开 com 端口并捕获所有扫描,但是 2 分钟后扫描仪进入睡眠状态。当扫描仪唤醒时,它不再连接,但 com 端口仍然打开。我需要一种方法来确定扫描仪是否仍然连接,或者在扫描仪再次唤醒时是否进入睡眠状态并关闭/重新打开 com 端口。

我在win10中将扫描仪与电脑配对,这会创建一个输入com端口(com4)。我可以打开那个端口并收听消息。问题是,扫描仪只使用一种通信方式,似乎它没有发送任何信息说“我现在断开连接”,它只是进入睡眠状态并断开连接。有什么方法可以看到扫描仪仍然连接,或者进入睡眠状态,或者任何可以连接的东西?扫描仪是 WASP WWS550i。

        _serialPort = New SerialPort(PortName, BaudRate, Parity.None, 8, StopBits.One)
        _serialPort.PortName = PortName
        _serialPort.Parity = Parity.None
        _serialPort.DataBits = 8
        _serialPort.BaudRate = BaudRate
        _serialPort.StopBits = StopBits.One

        AddHandler _serialPort.DataReceived, AddressOf sp_DataReceived

        _serialPort.Open()

Private Sub sp_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
    _LastDataReceived = _serialPort.ReadLine()
End Sub

标签: .netbluetoothspp

解决方案


我对 Pos 平板电脑扫描仪有完全相同的问题。ASP.CORE 3 工人服务

我通过唤醒后重新打开串口解决了这个问题。此外,如果我尝试重新打开端口,端口会显示端口不可用,因为端口未正确关闭(处置)。


我的解决方案

我写了 1 秒检查器来检查端口是否仍然打开。如果不是,则调用close()先前的串行端口实例,然后重新打开该端口。

现在我可以在醒来后扫描。

public class Worker : BackgroundService
    {
        private static SerialPort SERIAL_PORT;

        // constructor DI

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {

        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            // create serial port connection
            _logger.LogInformation($"-- open serial port {PORT_NAME}");

            SERIAL_PORT = SerialPortFactory.Create(PORT_NAME);
            SERIAL_PORT.Open();

            _logger.LogInformation($"-- serial port {PORT_NAME} opened");

            Task.Run(() => Checker(_logger)); // run port checker on another thread

            return base.StartAsync(cancellationToken);
        }

        public override Task StopAsync(CancellationToken cancellationToken)
        {
            SERIAL_PORT.Close();
            return base.StopAsync(cancellationToken);
        }

        public static void Checker(ILogger<Worker> _logger)
        {
            for (;;)
            {
                _logger.LogInformation("Sleep for 1 second!");
                Thread.Sleep(1000);
                try
                {
                    _logger.LogInformation(SERIAL_PORT.IsOpen.ToString());
                    if(!SERIAL_PORT.IsOpen)
                    {
                        SERIAL_PORT.Close();
                        Thread.Sleep(100); // is not necessary but ...

                        SERIAL_PORT = SerialPortFactory.Create(PORT_NAME);
                        SERIAL_PORT.Open();

                        _logger.LogInformation($"-- serial port {PORT_NAME} opened");
                    }
                } catch(Exception e)
                {
                    _logger.LogError(e.Message);
                }
            }
        }
    }

SerialPortFactory - 只是我的 MS doc 中新 SerialPort 的简单包装类


推荐阅读