Поиск устройства подключенного к 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) { /* Девайса нет */ }