хороший класс последовательного порта для .net framework?
-
20-08-2019 - |
Вопрос
Кто-нибудь знает хороший (надеюсь, бесплатный) класс для замены класса .net SerialPort?Это вызывает у меня проблемы, и мне нужен немного более гибкий.
Смотрите мою другую тему о моих проблемах, но, по сути, мне нужно запретить выдачу команд IOCTL_SERIAL_SET_DTR и IOCTL_SERIAL_CLR_DTR при открытии порта, поэтому мне нужно что-то более гибкое, чем класс, предоставляемый .net framework.
Решение
Несколько лет назад я использовал OpenNETCF.IO.Последовательный до того, как в .net была добавлена поддержка последовательного доступа.Это для compact framework, но я использовал его как для компактных устройств, так и для обычных приложений Windows.Вы получаете исходный код, чтобы вы могли изменить его самостоятельно, что я и сделал.
Это в основном создает оболочку c # вокруг последовательной функции, импортированной из kernel32.dll.
Возможно, вы также захотите взглянуть на Как захватить последовательный порт, который исчезает из-за отсоединения USB-кабеля
Вот код, который я использовал, чтобы вызвать это
using OpenNETCF.IO.Serial;
public static Port port;
private DetailedPortSettings portSettings;
private Mutex UpdateBusy = new Mutex();
// create the port
try
{
// create the port settings
portSettings = new HandshakeNone();
portSettings.BasicSettings.BaudRate=BaudRates.CBR_9600;
// create a default port on COM3 with no handshaking
port = new Port("COM3:", portSettings);
// define an event handler
port.DataReceived +=new Port.CommEvent(port_DataReceived);
port.RThreshold = 1;
port.InputLen = 0;
port.SThreshold = 1;
try
{
port.Open();
}
catch
{
port.Close();
}
}
catch
{
port.Close();
}
private void port_DataReceived()
{
// since RThreshold = 1, we get an event for every character
byte[] inputData = port.Input;
// do something with the data
// note that this is called from a read thread so you should
// protect any data pass from here to the main thread using mutex
// don't forget the use the mutex in the main thread as well
UpdateBusy.WaitOne();
// copy data to another data structure
UpdateBusy.ReleaseMutex();
}
private void port_SendBuff()
{
byte[] outputData = new byte[esize];
crc=0xffff;
j=0;
outputData[j++]=FS;
// .. more code to fill up buff
outputData[j++]=FS;
// number of chars sent is determined by size of outputData
port.Output = outputData;
}
// code to close port
if (port.IsOpen)
{
port.Close();
}
port.Dispose();
Другие советы
Я не пробовал пробовать это, но, возможно, вы сможете:
- Получите исходный код из
System.IO.Ports.SerialPort
используя Отражатель или что - то подобное - Измените этот исходный код так, как вам нравится
- Восстановите измененную копию в другом пространстве имен и используйте ее
Стандартный .NET SerialPort не является закрытым классом - есть ли шанс, что вы можете получить необходимое вам поведение от подкласса?