Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Исключение при работе с СОМ-портом

9.4K
11 декабря 2007 года
vitalik_4
37 / / 12.11.2006
работаю с устройством через СОМ-порт отправляю команды, получаю результаты. На некоторых
командах все нормально но на одной из команд выпадает исключение. Т.е сначала команда нормально возращает результат,
а потом уже выпадает исключение.

System.IO.IOException: Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения.

at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
at System.IO.Ports.SerialStream.EndRead(IAsyncResult asyncResult)
at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout)
at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count)
at System.IO.Ports.SerialPort.InternalRead(Char[] buffer, Int32 offset, Int32 count, Int32 timeout, Boolean countMultiByteCharsAsOne)
at System.IO.Ports.SerialPort.ReadTo(String value)
at System.IO.Ports.SerialPort.ReadLine()
at Novitek.Form1.sp_DataReceived(Object sender, SerialDataReceivedEventArgs e) in D:\1\Novitek\Novitek\Form1.cs:line 74

Ну и соответственно при закрытии порта программа намертво зависает Как обработать это исключение чтобы можно было
нормально продолнить работу. В чем вообще могут быть грабли ? Вот код:
Код:
void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
        //получаем ответ      
                answer += sp.ReadLine();//исключение выпадает здесь

            }
            catch (Exception exc)
            {
               StreamWriter sw = new StreamWriter(@"c:\exc");
               sw.WriteLine(exc.ToString());
               sw.Close();
            }
        }

private void ExecuteCommands()
        {
            //выполнение комманд требующих авторизации
            здесь команды выполняются нормально
           
           
            //получаем введеные в память телефоны
            sp.WriteLine("AT+CPBR=1,5");
            System.Threading.Thread.Sleep(500);
           
            string[] cmd = ParseAnswer2(answer);//анализируем ответ  
            string tmp;

            string[] s1 = null;
            string delim = ",";

            for (int i = 1; i < 6; i++)
            {
                tmp = FindMatch(cmd, "\"(.*)\"");
                s1 = tmp.Split(delim.ToCharArray(), 3);
                lstPhoneNum.Items.Add(s1[0].Replace("\"", ""));
            }
            sp.DiscardInBuffer();
            answer = "";
        }


        private string[] ParseAnswer2(string answer)
        {
       //здесь выполняется анализ ответа   
            string delimStr = "\n";
            char[] delimiter = delimStr.ToCharArray();
            string[] split = null;
            int n = 7;

            split = answer.Split(delimiter, n);            
            return split;
        }


[color=red]Для оформления кода используй теги. Модератор. [/color]
29K
27 октября 2009 года
B@HTy3
17 / / 04.11.2007
А как порт сконфигурирован? За выставленный таймаут (Свойства ReadTimeout) ответ в порт приходит?
241
28 октября 2009 года
Sanila_san
1.6K / / 07.06.2005
Хм. Вы бы хоть смотрели дату начала темы. ИМХО, задача едва ли актуальна спустя два года.:)
29K
01 ноября 2009 года
B@HTy3
17 / / 04.11.2007
Сорь, вы правы, но ничего страшного, кто-то будет возиться с такой-же проблемой, а очень неприятно видеть вопросы без ответов;)
55K
11 января 2010 года
Bierhoff
1 / / 06.12.2009
Тоже самое было - надо поменять serialport.WriteLine на serialport.ReadExisting
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог