EnChikiben
@EnChikiben

Как найти COM порт оптимально?

Добрый день, программа работает с raspberry pi pico по COM порту, для его поиска я в цикле посылаю на каждый порт сообщения и где мне ответили в нужном формате тот и мой.

Вопрос: если обходить порты по порядку в цикле то программа при старте "подвисает" (секунд на 20) пока дойдет до нужного порта, попробовал через потоки, вот так:

string[] ports = SerialPort.GetPortNames();

foreach (string port in ports)
{
   Thread t = new Thread(TestSerialPort);
   t.Start(port);
   if (!t.Join(TimeSpan.FromSeconds(1)))
   {
          t.Abort();
          throw new Exception("More than 1 secs.");
   }
}


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

И еще вопрос, а работа с COM портами всегда подразумевает что после отправки нужно подождать типа Thread.Sleep(500);?
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Во-первых, ардуино (ну как минимум китайские клоны) отдают определённый VID/PID USB устройства. Этим можно пользоваться для сужения диапазона поиска. Эту инфу можно узнать из реестра Windows.
Во-вторых, если ты контролируешь прошивку ардуинки, можешь заставить её отправлять какой-то хэндшейк (заранее известный пакет) при подключении к порту (обычно арудино перезагружается при коннекте к порту). Тогда достаточно подождать совсем чуть-чуть, отправка данных не потребуется. Также меньше шансов что-то поломать, отправив левые данные в неизвестное устройство.
В-третьих, просто сделай два последовательных цикла - один создаёт и запускает потоки, а второй их дожидается. Тогда ожидание будет параллельным.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы