.net - 有没有办法查看蓝牙 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
解决方案
我对 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 的简单包装类
推荐阅读
- c# - AWS Lambda 访问文件
- c# - 使用 JDBC 从 C# 访问 HyperSQL 的问题
- javascript - 拒绝位置后角度组件不起作用
- scala - Scala 中的错误转换以一种纯粹而安全的方式
- c# - 具有相同嵌套 xsd 类生成的多个 Xsd
- apache-kafka-streams - Kafka Streams DSL 重试逻辑(将记录写回主题)
- android - 房间 - 同步 @Delete all
- google-maps - 谷歌方向服务错误的航点订单返回
- visual-studio-code - 如何在 vs-code 上禁用 [abc] 建议?
- c# - 列表列表的 Where 子句