Поиск устройства подключенного к COM порту - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Возник у меня вопрос. Заказали мне сделать одну железяку которая по звонку с сотового телефона открывает шлагбаум если номер звонящего совпадает с номером в базе данных. Ну все работает. Команды железяка получает через SMS. Все бы нечего да вот клиенту не хочется 5000 абонентов SMS-ками записывать. Говорит мол как бы сей девайс к компьютеру подключить и через него. С учетом того что железяка работает под управлением Mega162 я смог к ней подключится только через UART. Так как сейчас на ноутбуках нет COM портов, то я использовал микросхему преобразователь USB <-> UART. Все бы ничего но клиент не хочет выбирать COM порт, мол пусть программа сама ищет железяку. Вот тут я и попал в тупик. Первое что пришло в голову, это получить все COM порты компьютера и поочередно открывать их и слать команду. Если пришел ответ, то вот он наш порт. И тут засада. Если я открываю порт, а на нем нет устройства, то при чтении ответа программа виснет. Вот код программы теста.
byte[] data = {1};
 
string[] portnames = SerialPort.GetPortNames();
 
for(int i=0; i<portnames.Length; i++)
{
      SerialPort port = new SerialPort(portnames[i], 19200, Parity.None, 8, StopBits.One);
      port.Open();
      port.Write(data, 0, data.Length);
      port.Read(data, 0, data.Length);
                
      if (data[0] == 1)
      {
             label1.Text = portnames[i];
             port.Close();
             break;
       }
       else
       {
             port.Close();
       }
}
Засада кроется вот здесь

port.Read(data, 0, data.Length);

. Если на RxD ничего не приходит, то программа на этой строчке виснет. Вопрос, можно как-нибудь это обойти? Существуют ли какие-нибудь тайменги для прекращения запроса?

Решение задачи: «Поиск устройства подключенного к COM порту»

textual
Листинг программы
port.Write(data, 0, data.Length); // Кидаем команду
try { port.Read(data, 0, data.Length); } // Читаем ответ(если ничего не пришло отваливаемся по ReadTimeout = 500
catch (TimeoutException) { /* Девайса нет */ }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы