Цикл запросов маски ожидания RJCP.IO.Ports после открытия последовательного порта в приложении WPFC#

Место общения программистов C#
Ответить
Anonymous
 Цикл запросов маски ожидания RJCP.IO.Ports после открытия последовательного порта в приложении WPF

Сообщение Anonymous »

Я впервые задаю здесь вопрос, и я программист-любитель. Я учусь методом проб и ошибок, поэтому заранее прошу прощения, если из-за моего кода у вас потекут глаза.
Сейчас я создаю приложение на WPF с использованием MVVM (.NET 6.0) для управления магазином. Не буду вдаваться в подробности (да, это большой проект для новичка, да, он сложный и может пойти не так по-разному, но приложение работает, так что я более-менее знаю, что делаю). Однако я застрял в «проблеме», которую просто не могу уяснить.
У меня есть сервис, который подключает мое приложение к кассовому аппарату через последовательный порт, который требует определенных «команд». Эта служба использует RJCP.IO.Ports, и она используется одной из моих моделей ViewModel, и мне удалось заставить ее работать так, чтобы устройство правильно реагировало на отправленные ему команды протокола XON-XOFF. Однако, когда я использую Device Monitor Studio для мониторинга данных, отправляемых в порт, я замечаю, что каждую секунду после открытия порта появляются сотни запросов, связанных с «WaitMask». Несмотря ни на что, я не могу их остановить.
В окне «Просмотр запросов» видно, что эти запросы зацикливаются бесконечно:

Код: Выделить всё

000041: I/O Request (DOWN): 2024-11-17 00:14:06,712104 +0,003315
IOCTL_SERIAL_SET_WAIT_MASK: Set wait mask
· Wait Mask     = SERIAL_EV_RXCHAR | SERIAL_EV_RXFLAG | SERIAL_EV_TXEMPTY | SERIAL_EV_CTS | SERIAL_EV_DSR | SERIAL_EV_RLSD | SERIAL_EV_BREAK | SERIAL_EV_ERR | SERIAL_EV_RING (0x1ff)

000042: I/O Request (UP): 2024-11-17 00:14:06,712203 +0,000099
IOCTL: IOCTL_SERIAL_SET_WAIT_MASK

000043: I/O Request (DOWN): 2024-11-17 00:14:06,712227 +0,000024
IOCTL_SERIAL_SET_WAIT_MASK: Set wait mask
· Wait Mask     = SERIAL_EV_RXCHAR | SERIAL_EV_RXFLAG | SERIAL_EV_TXEMPTY | SERIAL_EV_CTS | SERIAL_EV_DSR | SERIAL_EV_RLSD | SERIAL_EV_BREAK | SERIAL_EV_ERR | SERIAL_EV_RING (0x1ff)

000044: I/O Request (UP): 2024-11-17 00:14:06,712318 +0,000091
IOCTL: IOCTL_SERIAL_SET_WAIT_MASK

000045: I/O Request (DOWN): 2024-11-17 00:14:06,713507 +0,001189
IOCTL: IOCTL_SERIAL_GET_COMMSTATUS

000046: I/O Request (UP): 2024-11-17 00:14:06,713547 +0,000040
IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status
· Errors                    = 0x0
· Hold reasons              = 0x0
· In queue                  = 0
· Out queue                 = 0
· EOF received              = false
· Wait for immediate        = false

000047: I/O Request (DOWN): 2024-11-17 00:14:06,714582 +0,001035
IOCTL_SERIAL_WAIT_ON_MASK: Start waiting for event

000048: I/O Request (DOWN): 2024-11-17 00:14:06,717894 +0,003312
IOCTL_SERIAL_SET_WAIT_MASK: Set wait mask
· Wait Mask     = SERIAL_EV_RXCHAR | SERIAL_EV_RXFLAG | SERIAL_EV_TXEMPTY | SERIAL_EV_CTS | SERIAL_EV_DSR | SERIAL_EV_RLSD | SERIAL_EV_BREAK | SERIAL_EV_ERR | SERIAL_EV_RING (0x1ff)

000049: I/O Request (UP): 2024-11-17 00:14:06,718000 +0,000106
IOCTL_SERIAL_WAIT_ON_MASK: Wait for event
· Wait Mask     = 0x0

000050: I/O Request (UP): 2024-11-17 00:14:06,718037 +0,000037
IOCTL: IOCTL_SERIAL_SET_WAIT_MASK

000051: I/O Request (DOWN): 2024-11-17 00:14:06,718046 +0,000010
IOCTL: IOCTL_SERIAL_GET_COMMSTATUS

000052: I/O Request (UP): 2024-11-17 00:14:06,718093 +0,000046
IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status
· Errors                    = 0x0
· Hold reasons              = 0x0
· In queue                  = 0
· Out queue                 = 0
· EOF received              = false
· Wait for immediate        = false

000053: I/O Request (DOWN): 2024-11-17 00:14:06,720573 +0,002480
IOCTL_SERIAL_SET_WAIT_MASK: Set wait mask
· Wait Mask     = SERIAL_EV_RXCHAR | SERIAL_EV_RXFLAG | SERIAL_EV_TXEMPTY | SERIAL_EV_CTS | SERIAL_EV_DSR | SERIAL_EV_RLSD | SERIAL_EV_BREAK | SERIAL_EV_ERR | SERIAL_EV_RING (0x1ff)

000054: I/O Request (UP): 2024-11-17 00:14:06,720611 +0,000038
IOCTL: IOCTL_SERIAL_SET_WAIT_MASK

000055: I/O Request (DOWN): 2024-11-17 00:14:06,720643 +0,000032
IOCTL: IOCTL_SERIAL_GET_COMMSTATUS

000056: I/O Request (UP): 2024-11-17 00:14:06,720690 +0,000046
IOCTL_SERIAL_GET_COMMSTATUS: Retrieve COM status
· Errors                    = 0x0
· Hold reasons              = 0x0
· In queue                  = 0
· Out queue                 = 0
· EOF received              = false
· Wait for immediate        = false

000057: I/O Request (DOWN): 2024-11-17 00:14:06,720710 +0,000021
IOCTL_SERIAL_WAIT_ON_MASK: Start waiting for event
Я не знаю, что мне делать. Я не знаком с тем, как работают последовательные порты; Я просто изо всех сил старался понять это. Ниже приведен код моего сервиса:

Код: Выделить всё

using App.Contracts.Services;
using App.ViewModels;
using RJCP.IO.Ports;
using System.IO;
using System.Text;
namespace App.Services;
public class CashRegisterService : ICashRegisterService
{
private readonly Logger logSent;
private readonly Logger logExc;
private SerialPortStream P;
public SerialPortStream Port => P;
private readonly object portLock = new();
private bool isPortOpen;

public CashRegisterService()
{
string defaultPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs");

if (!Directory.Exists(defaultPath))
Directory.CreateDirectory(defaultPath);

logSent = new Logger(defaultPath, ".log", "Rs232");
logExc = new Logger(defaultPath, ".exc", "Rs232Exc");
}

public void SetPort(int portNum = 4, int baudRate = 9600, int databits = 8,
Parity parity = Parity.None, StopBits stopBits = StopBits.One)
{
if (portNum   0);
}
catch (TimeoutException)
{
WriteLog("Timeout: No answer.");
}
return answer.ToString();
}

public void CloseConnection()
{
lock (portLock)
{
if (isPortOpen)
{
try
{
P.Close();
isPortOpen = false;
WriteLog($"Connection {P.PortName} closed.");
}
catch (Exception ex)
{
WriteLog($"Error: {ex.Message}", true);
}
}
}
}

public void SendCommand(string command)
{
lock (portLock)
{
if (!isPortOpen)
throw new InvalidOperationException("Serial Port is closed.");

try
{
P.Write(command);
WriteLog($"command sent: {command}");

Thread.Sleep(100);

try
{
string response = ReadAnswer();
if (!string.IsNullOrWhiteSpace(response))
WriteLog($"Datas received: {response}");
else
WriteLog("Any data received.");
}
catch (TimeoutException)
{
WriteLog("Timeout: No answer.");
}
}
catch (Exception ex)
{
WriteLog($"Error for command '{command}': {ex.Message}", true);
throw;
}
}
}

private void WriteLog(string message, bool isError = false)
{
try
{
if (isError)
logExc.writeLog(message);
else
logSent.writeLog(message);
}
catch (Exception ex)
{
Console.WriteLine($"Error Log: {ex.Message}");
}
}
//rest of the code
}
Еще раз извините, если этот код покажется вам беспорядочным (также английский не является моим родным языком, поэтому я прошу прощения, если что-то покажется странным или грамматически неправильным)
Я пробовал много чего, но в библиотеке RJCP.IO.Ports нет четких методов для установки событий WaitMask. Я что-то упустил?

Подробнее здесь: https://stackoverflow.com/questions/793 ... pf-applica
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»