реклама на сайте
подробности

 
 
> USB CDC на PIC18F2550, Работа ping-pong buffer
J-t
сообщение Feb 5 2009, 09:00
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 18-10-07
Пользователь №: 31 461



Доброго времени суток.
Прошу помочь, ответом на такой вопрос:
Собрал схему USB CDC устройства на PIC18F2550, скачал родные исходники с microchip.com, подправил кое, что в функциях пользователя.
Работает так: на PC с помощью терминала отправляю в появившийся виртуальный порт строку из 5 байт, по идее они сохраняются в буфере до их прочтения. Читаю принятую инф. после нажатия на кнопку на плате устройства, а на терминале получаю ответ от устройства. Так вот, пытливости ради, отправил дважды одну и ту же последовательность, нажал на кнопку, устройство ответило один раз на первую посылку. Отправил последовательность трижды... две отобразились на терминале как отправленные, третья не отобразилась в строке отосланных, терминал повис, нажал на кнопку устройства, в строке отосланных появился третья отправленная последовательность, устройство ответило на первое и третье. То что ответ приходит на первую и третью последовательность проверил сделав последовательности разными.
Тут возник вопрос: куда девалась вторая последовательность? Если устройство удержало посылку только третей последовательности, значит вторую он принял... ???
Буфер сконфигурирован: no ping-pong.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
J-t
сообщение Feb 6 2009, 06:50
Сообщение #2





Группа: Новичок
Сообщений: 10
Регистрация: 18-10-07
Пользователь №: 31 461



Вот то что писал сам (в целях обучения):
void ProcessIO(void)
{
//Blink the LEDs according to the USB device status
// BlinkUSBStatus();

// User Application USB tasks
mInitSwitch3();
if(sw3 == 0)
{
if(getsUSBUSART(USB_Out_Buffer, 8) == 5)
{
if (USB_Out_Buffer[0] == 'a')
{
if(USB_Out_Buffer[1] == 'a')
{
if(USB_Out_Buffer[2] == 'a')
{
if(USB_Out_Buffer[3] == 'a')
{
if(USB_Out_Buffer[4] == 'a')
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART("A");
}
}
}
}
}
}
if (USB_Out_Buffer[0] == 'b')
{
if(USB_Out_Buffer[1] == 'b')
{
if(USB_Out_Buffer[2] == 'b')
{
if(USB_Out_Buffer[3] == 'b')
{
if(USB_Out_Buffer[4] == 'b')
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART("B");
}
}
}
}
}
}
if (USB_Out_Buffer[0] == 'c')
{
if(USB_Out_Buffer[1] == 'c')
{
if(USB_Out_Buffer[2] == 'c')
{
if(USB_Out_Buffer[3] == 'c')
{
if(USB_Out_Buffer[4] == 'c')
{
if(mUSBUSARTIsTxTrfReady())
{
putrsUSBUSART("C");
}
}
}
}
}
}
}
}

Мой код ничего не делает полезного, пока.
кнопка нужна, что бы давать отмашку на чтение из буфера данных; три последовательности: ааааа, bbbbb, ccccc на каждую из них PIC отвечает A или B или C.

Конечная цель всего этого - понять по какому алгоритму стоит действовать если пользовательская программа работает в цикле с другим контроллером или подключенным устройством (например: мерит температуру и показывает ее на дисплее) и в любой момент времени могут прийти данных от ПК по USB? Что будет если я не смогу их прочитать (нажать на кнопку, в программе выше) в виду выполнения более важных операций?

Сделал бесконечный цикл в подпрограмме пользователя, ПК вовсе не увидел устройство, я так понял, что из за того, что не вызывается функция USBDeviceTasks(). Тогда ее нужно включить в цикл подпрограммы пользователя?

Сообщение отредактировал J-t - Feb 6 2009, 07:43
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 08:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016