AmirSina Mashayekh Ответов: 1

Создайте список, который показывает доступные последовательные порты синхронно


Привет.

Я создаю программу windows (Visual Studio - C#) для связи с микроконтроллером AVR с помощью последовательного порта. Я хочу показать доступные последовательные порты в списке (или combobox) и обновить список немедленно, когда новое устройство доступно или устройство отключено.

В настоящее время я использую кнопку "Обновить", чтобы сделать это, но я хочу, чтобы она обновлялась автоматически.

Кроме того, у меня есть кнопка "подключиться". Я хочу, чтобы он был отключен, когда нет ни одного доступного порта, и был включен, когда некоторые порты доступны и пользователь выбрал один из них. В настоящее время кнопка "Обновить" обновляет свое состояние.

Я уже искал в google, но не нашел никакой "понятной" вещи! Я не очень хорошо знаком с C# и вообще с языками ООП (я просто писал C около 3 лет).

Что я уже пробовал:

Попробовал привязать данные, но это не сработало. Я думаю, что использовал его неправильно.
Текущий код (упрощенный):
Файл MainWindow.язык XAML:
<ListBox x:Name="portList" Grid.Row="1" Margin="0,5"/>
<Button x:Name="refreshButton" Grid.Row="2" Content="Refresh" HorizontalAlignment="Left" Width="75" Click="RefreshButton_Click"/>
<Button x:Name="connectButton" Grid.Row="2" Content="Connect" HorizontalAlignment="Right" Width="75" Click="ConnectButton_Click"/>

ManiWindow.язык XAML.в CS:
public MainWindow()
{
	InitializeComponent();
	Port_check();
}
private void RefreshButton_Click(object sender, RoutedEventArgs e)
{
	Port_check();
}
private void ConnectButton_Click(object sender, RoutedEventArgs e)
{
	if (!connected)
	{
		Ser_Connect();
	}
	else
	{
		Ser_Disconnect();
	}
}

Серийный.в CS:
public readonly SerialPort serialPort = new SerialPort
{
	BaudRate = 38400,
	ReadBufferSize = 8,
	WriteTimeout = 500,
	ReadTimeout = 5000
};
public static bool connected = false;
public void Port_check()
{
	string[] ports = SerialPort.GetPortNames();
	if (ports.Length != 0)
	{
		Ports_available(ports);
	}
	else
	{
		No_ports_available();
	}
}
private void Ports_available(string[] ports)
{
	portList.Items.Clear();
	foreach (string port in ports)
	{
		portList.Items.Add(port);
	}
	portList.IsEnabled = true;
	portList.SelectedIndex = 0;
	connectButton.IsEnabled = true;
}
private void No_ports_available()
{
	portList.Items.Clear();
	portList.IsEnabled = false;
	connectButton.IsEnabled = false;
}
public void Ser_Connect()
{
	//connection codes
}
public void Ser_Disconnect()
{
	if (serialPort.IsOpen)
	{
		serialPort.DtrEnable = false;
		serialPort.Close();
	}
	connectButton.Content = "Connect";
	portList.IsEnabled = true;
	refreshButton.IsEnabled = true;
	connected = false;
	Port_check();
}

CHill60

"Я думаю, что использовал его неправильно" ... чтобы мы могли судить, что нам нужно увидеть ваш код!

Richard MacCutchan

Вы использовали отладчик, чтобы проверить, действительно ли вы получаете какие-либо элементы для добавления в свой список?

AmirSina Mashayekh

Приведенный выше код работает отлично, но я хочу избавиться от кнопки "Обновить".

Richard MacCutchan

Зачем вам это нужно?

AmirSina Mashayekh

1 - чтобы узнать больше о c#, wpf и ...
2 - чтобы сделать мое приложение лучше! :)

Richard MacCutchan

Это не имеет никакого смысла.

1 Ответов

Рейтинг:
0

Maciej Los

Хорошо... Начать здесь: Список готовых к использованию последовательных портов перечисления[^]

Для получения более подробной информации, пожалуйста, смотрите: Последовательный порт.Методом GetPortNames (Системы.ИО.Порта) | Майкрософт Документы[^]

[РЕДАКТИРОВАТЬ]
Нет никакой гарантии, что SerialPort.GetPortNames метод вернет имена портов. Но есть и обходные пути. Видеть:

void Main()
{
	
	List<SerialPortInfo> ports = null;
	string qry = "SELECT * FROM Win32_PnPEntity WHERE Caption like '%COM%'";
	//or:
	//qry = "SELECT * FROM Win32_SerialPort";
	using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\CIMV2", qry))
	{
		ports = searcher.Get().Cast<ManagementBaseObject>()	
			.Select(sp => new SerialPortInfo ((string)sp["DeviceID"], (string)sp["Caption"])) 
			.ToList() ;
	}
	foreach(SerialPortInfo mp in ports)
	{
		Console.WriteLine("{0} - {1}", mp.ID, mp.Name);
	}
	
}

// Define other methods and classes here
public class SerialPortInfo
{	
	public SerialPortInfo(string _id, string _name)
	{
		ID = _id;
		Name = _name;
	}
	
	public string ID = "";
	public string Name = "";
	
}