Ссылка на объект не установлен на экземпляр объекта System.io.portsC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Ссылка на объект не установлен на экземпляр объекта System.io.ports

Сообщение Anonymous »

Мы создали приложение для настольного компьютера .NET с использованием LattePanda для чтения данных датчика с печатной платы с использованием протокола связи RS485. Код C# использует библиотеку EasyModbus для чтения данных. Приложение работает в некоторой степени, но в какой -то момент оно выбрасывает следующую ошибку: < /p>

ссылка на объект не установлен на экземпляр объекта.
at system.io.ports.serialstream.eventlooprunner.callreceiveevents (object wation)
at system.threading.queueuserworkitemcallback.execute ()
at System.Threading.ThreadPoolworke.dispatch ()
at system.thread System.Threading.PortaleThreadPool.workerThread.workerThreadStart ()

В Follwing вы можете увидеть, что C# Code создает ModbusClient объект и вызывает метод ReadInputRegisters () .

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

private readonly SemaphoreSlim _lock = new (1, 1);

private static ModbusClient CreateAndConnectClient(string comPort, int baudrate, byte unitIdentifier)
{
try
{
ModbusClient modbusClient = new(comPort)
{
UnitIdentifier = unitIdentifier,
Baudrate = baudrate,
Parity = Parity.None,
StopBits = StopBits.One,
ConnectionTimeout = 1000
};
modbusClient.Connect();
return modbusClient;

}
catch (ModbusException ex) {
Trace.WriteLine("ModbusException: " + ex.Message);
throw;
}
catch (Exception ex)
{
Trace.WriteLine("Unhandled Exception: " + ex.Message);
throw;
}
}

public async Task ReadInputRegistersAsync(string comPort, int baudrate,  byte unitIdentifier, int startAddress, int quantity)
{
await _lock.WaitAsync();
ModbusClient? modbusClient = null;
try
{
// Attempt to create and connect the Modbus client
modbusClient = CreateAndConnectClient(comPort, baudrate, unitIdentifier);

// Check if the client was successfully created and connected
// to avoid Exception --> "Object reference not set to an instance of an object"
if (modbusClient == null)
{
Trace.WriteLine("ModbusClient is null.");
return new int[quantity];
}

var data = modbusClient.ReadInputRegisters(startAddress, quantity) ?? new int[quantity];
return data;

}
catch (ModbusException ex)
{
Trace.WriteLine("ModbusException in ReadInputRegistersAsync: " + ex.Message);

// Return a new empty integer array
return new int[quantity];
}
catch (Exception ex)
{
Trace.WriteLine("Unhandled Exception in ReadInputRegistersAsync: " + ex.Message);
return new int[quantity];
}
finally
{
if (modbusClient!=null && modbusClient.Connected)
{
modbusClient.Disconnect();
}
_lock.Release();
}
}
Тогда в следующем классе мы называем readinputregistersasync ()
public List GetData(DateTime date)
{
var data = new List();
var items = GetSensors();
var groupeItems = items.GroupBy(i => i.SlaveID).ToList();

foreach (var itemGroup in groupeItems)
{
var sensors = itemGroup.ToList();
var sensor = sensors.OrderBy(i => i.InputCh).LastOrDefault();
if (sensor == null) continue;
var readTask = modbusManager.ReadInputRegistersAsync(
$"COM{sensor.SerPort}", 9600, (byte)itemGroup.Key, 0, sensor.InputCh);
Trace.WriteLine("^^^^^^^^^^^^^^^^^^^ READ TASK SlaveID: " + (byte)itemGroup.Key);
readTask.ContinueWith(task =>
{
if (task.IsCompletedSuccessfully)
{
var list = task.Result.ToList();
data.AddRange(sensors.ConvertAll(s =>
new RawInput()
{
ItemId = s.Id,
RawValue = list[s.InputCh - 1]
}
));
}
else
{
Trace.WriteLine("^^^^^^^^^^^^^^^^^^^ READ TASK IS NOT COMPLETED SUCCESSFULLY");
data.AddRange(sensors.ConvertAll(s => new RawInput()
{
ItemId = s.Id,
RawValue = 0
}));
}

}).Wait();
}
return data;
}
< /code>
Мы не смогли найти причину этого завершения. Почему это бросает исключение?

Подробнее здесь: https://stackoverflow.com/questions/770 ... m-io-ports
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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