Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
1

SerialPort ReadTimeout срабатывает через раз

22.08.2016, 11:31. Показов 6051. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Последовательный порт открывается при загрузке формы, таймаут чтения 500 мс, в обработчике от кнопки отправляем запрос,
почему при отсутствии ответа на запрос сообщение "время ожидания операции завершено" стабильно появляется через одно нажатие.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private void Form1_Load(object sender, EventArgs e)
{
        _serialPort.PortName = "COM5";      // 
        _serialPort.BaudRate = 115200;      // 
        _serialPort.Parity = Parity.Even;   // 
        _serialPort.DataBits = 8;           // 
        _serialPort.StopBits = StopBits.One;// 
        _serialPort.ReadTimeout = 500;      // 500 мс.
        _serialPort.WriteTimeout = 500;     // 500 мс.
 
        try
        {
                _serialPort.Open();
                if (_serialPort.IsOpen)
                {
                        listBox1.Items.Add("Serial port " + _serialPort.PortName + " opened !" + '\n');
                }
        }
 
        catch
        {
                listBox1.Items.Add("Serial port " + _serialPort.PortName + " not available !!!" + '\n');
        }
}
 
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
        _serialPort.Close();
}        
 
private void button1_Click(object sender, EventArgs e)
{
        byte[] Request = new byte[1] { 0x7F };
        byte[] Response = new byte[1] { 0x00 };
 
        // Порт открыт (кнопка доступна).
        _serialPort.Write(Request, 0, Request.Length);      // Пишем запрос в порт.
        listBox1.Items.Add("W: " + GetTime() + " " + MessageToString(Request));
 
        int iCounter = 0;       // Индекс байта в ответе на запрос.  
        int mCounter = 1;       // Ожидаемое количество байт в ответе.
 
        try
        {                    
                while (iCounter < mCounter) // Пока текущее количество байт меньше ожидаемого.
                        {
                        iCounter += _serialPort.Read(Response, iCounter, mCounter - iCounter);  // Читаем.                        
                        } 
        }
        catch (TimeoutException t)
        {
                //MessageBox.Show("Нет связи!"); // Прошло 500 мс, а ответа нет.
                MessageBox.Show(t.Message); // Время ожидания операции истекло.
        }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.08.2016, 11:31
Ответы с готовыми решениями:

При вызове функции через поток кнопкой все проходит корректно, но через таймер срабатывает только раз
Приложение для архивирования баз 1С 7.7. все работает хорошо только вот функция ведет себя...

Метод AfterLoad в WebBrowser срабатывает через раз
Всем привет. У меня возник непонятный глюк. Функционал такой. После инициализации формы к...

Как через serialport принять неизвестное количество байт
как через serialport принять неизвестное количество байт

Combobox срабатывает один раз
Почему combobox срабатывает один раз. ыПерезагрузишь форму и выберишь другой. Второй не выбирается....

3
Эксперт .NETАвтор FAQ
10410 / 5140 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.08.2016, 11:59 2
Цитата Сообщение от Joint14 Посмотреть сообщение
стабильно появляется через одно нажатие
Возможно в буфере остаются данные с прошлого раза?
Может стоит очистить буфер приема перед тем как отправлять запрос (методом DiscardInBuffer)?
1
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
22.08.2016, 12:09  [ТС] 3
Не помогло
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void button1_Click(object sender, EventArgs e)
{
        byte[] Request = new byte[1] { 0x7F };
        byte[] Response = new byte[1] { 0x00 };
 
        _serialPort.DiscardInBuffer();
 
        // Порт открыт (кнопка доступна).
        _serialPort.Write(Request, 0, Request.Length);      // Пишем запрос в порт.
        listBox1.Items.Add("W: " + GetTime() + " " + MessageToString(Request));
 
        int iCounter = 0;       // Индекс байта в ответе на запрос.  
        int mCounter = 1;       // Ожидаемое количество байт в ответе.
 
        try
        {                    
                while (iCounter < mCounter) // Пока текущее количество байт меньше ожидаемого.
                        {
                        iCounter += _serialPort.Read(Response, iCounter, mCounter - iCounter);  // Читаем.                        
                        } 
        }
        catch (TimeoutException t)
        {
                //MessageBox.Show("Нет связи!"); // Прошло 500 мс, а ответа нет.
                //MessageBox.Show(t.Message); // Время ожидания операции истекло.
                listBox1.Items.Add(t.Message);
        }
}
После первого запроса в порт не срабатывает TimеoutException, после второго срабатывает и.т.д., через раз. Должно же срабатывать, ведь связи нет (ответ на запрос не приходит).
Миниатюры
SerialPort ReadTimeout срабатывает через раз  
0
0 / 0 / 0
Регистрация: 17.12.2013
Сообщений: 28
22.08.2016, 12:35  [ТС] 4
Виноват! Проблема возникла после совместной работы сниффера виртуального COM-порта и моего приложения. Теперь TimeoutException срабатывает примерно через 550 мс.
Миниатюры
SerialPort ReadTimeout срабатывает через раз  
0
22.08.2016, 12:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.08.2016, 12:35
Помогаю со студенческими работами здесь

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?:...

Таймер срабатывает неверное количество раз
Доброго времени суток, друзья! Помогите пожалуйста разобраться! Необходимо производить действие с...

Событие срабатывает только первый раз
Есть форма. На ней два элемента: button1 (для вызова события) label1 (для просмотра события). ...

Почему таймер срабатывает несколько раз?
Доброго времени суток, друзья. Нужен таймер, по прошествии которого выполняется программа. Создаю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru