| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Мост USB-USART проблемы с ноутбуком
05.06.2015, 11:53
|
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Хор. ушли от конструктивной критики).
Далее по факту из MSDNа. Что не так при использовании события SerialPort.DataReceived.
То, что это событие в дополнительном потоке? И обработку элементов формы желательно производить через делегат.
Прекрасно. "попытка изменить некоторые элементы в основном потоке (например, элементы интерфейса пользователя) может вызвать исключение потоковой обработки." - MSDN.
Отлично. Только если заметили блоком try{} выделено всего пару строк приема данных. И исключение возникает именно в этом блоке. А "попытка изменить некоторые элементы в основном потоке" проходит без исключений. Это как раз таки-проверено. Что на это гуру скажет?)
|
|
|
|
05.06.2015, 11:59
|
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Сообщение от Boba_spb
|
|
Какой класс Вы имеете ввиду? System.Threading.Timer или System.Windows.Forms.Timer
|
Я имею ввиду то, что автор вашей ссылки использовал класс usercontrol для отрисовки экрана. Видимо он для себя ставил такую задачу.
Просто отображать часы на экране можно и в главной форме в элементе pictureBox. Обновляя каждые полсекунды экран через событие
System.Windows.Forms.Timer.Tick
|
|
|
|
05.06.2015, 14:55
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Сообщение от shurenock
|
|
А "попытка изменить некоторые элементы в основном потоке" проходит без исключений. Это как раз таки-проверено. Что на это гуру скажет?)
|
Скорее всего в основном потоке нет никакого обращения к контролам. Поэтому лететь нечего.
Так какая ошибка в try{} происходит.
замените свой catch на это
catch ( System.Exception ex )
{
MessageBox.Show ( "Error: " + ex.Message );
//Остановка генерации
MessageBox.Show("Ошибка приема данных!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
btStartMode4.Text = "Старт";
}
|
|
|
|
05.06.2015, 15:07
|
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Да, я об этом сегодня ночью в 00.13 уже писал, что хочу ошибку идентифицировать. После обеда доберусь до макета, обязательно сделаю. По результату отпишусь. Самому интересно, что винда скажет на это.)))
|
|
|
|
05.06.2015, 15:23
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Скажет что за размеры массива улетели
|
|
|
|
05.06.2015, 17:51
|
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Угу. Именно так и сказала. Только за пределы не того массива, что вы говорили serialInByte.
Улетает она конкретно в трех строчках:
temp = serialPortMCU.BytesToRead;
byte[] tempBuff = new byte[temp];
serialPortMCU.Read(tempBuff, 0, temp);
Попробовал поставить проверку при создании массива на temp›0. Это не то.
Как-то я пока логики не вижу. Буфер на прием в SerialPort стоит очень большой. Метод Read выбирает данные и удаляет их из очереди асинхронно с приемом. Ну пришли дополнительные данные в хвост очереди. И что? Метод должен выбрать количество данных, считанных ранее со свойства .BytesToRead. Если в очереди оказалось больше данных, лишние останутся.
Короче вопросы остались.
|
|
|
|
05.06.2015, 18:23
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Напишите так
void serialPortMCU_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int temp = 0;
byte[] tempBuff = new byte[32];
try
{
temp= serialPortMCU.Read(tempBuff, 0, 32);
if(temp ‹=0) return;
//Перекидываем байты из временного массива в массив очереди для обработки
for (int i = countByteInBuff, j = 0; i ‹ countByteInBuff + temp; i++, j++)
{
serialInByte[i] = tempBuff[j];
}
}
catch
{
//Остановка генерации
MessageBox.Show("Ошибка приема данных!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
btStartMode4.Text = "Старт";
}
|
|
|
|
05.06.2015, 18:31
|
|
|
Частый гость
Регистрация: 01.04.2005
Сообщений: 33
Сказал спасибо: 0
Сказали Спасибо 7 раз(а) в 6 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Ок. Попробую.
Хотя я уже по частям это пробовал. Создание массива за try выносил. Фиксированную длину его пробовал. Только число элементов 100 брал. Проверку на temp›0 тоже делал.
Надо попробовать все вместе.))) Как только - сразу отпишусь.
Кстати можно в messageBox с ошибкой вывести значение temp. Заодно посмотрим чему оно равно при возникновении исключения.
|
|
|
|
05.06.2015, 18:40
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Закомментируйте две строки, которые через Invoke должны работать
|
|
|
|
05.06.2015, 21:11
|
|
|
Заблокирован
Регистрация: 21.01.2014
Сообщений: 589
Сказал спасибо: 7
Сказали Спасибо 267 раз(а) в 206 сообщении(ях)
|
Re: Мост USB-USART проблемы с ноутбуком
Сообщение от Boba_spb
|
|
temp= serialPortMCU.Read(tempBuff, 0, 32);
|
Если принято меньше 32 байтов, то serialPortMCU.Read() будет до упора ждать, а потом вылетит в catch{} по таймауту.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:18.
|
|