Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
1

printf для USB

20.05.2014, 21:49. Просмотров 3394. Ответов 6
Метки нет (Все метки)

Посылать и принимать байтики научился, а вот как привязать ф-цию prymtf не знаю. Подскажите в какую сторону рыть, что использовать prymtf.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2014, 21:49
Ответы с готовыми решениями:

не работает printf для float
Почти день убил на то, чтобы исправить проблему, но не получилось. Использую STM32F4Dyscovery и...

CCID USB,сниффер для USB.
У кого есть пример CCID USB ? Посоветуйте сниффер для USB. Если например в CDC изменить ...

Переводить команды USB WIFI Адаптера через компьютер по USB-USB для устройства
name: как передавать сигнал от требующего установку драйверов USB WIFI Адаптера через компьютер по...

Ошибка - Warning: printf() [function.printf]: Too few arguments
привет всем. создал форму вывода данных из таблицы: <?php $result3 = mysql_query("select img,...

Не могу понять как исправить ошибку Warning: printf() [function.printf]: Too few arguments in Z:\home\ksards.ru\www\id\1.php on line 76
Помогите связать бд с сайтом я новичок в этом вот код php <?php do { printf("<div...

6
itysiy
0 / 0 / 0
Регистрация: 18.01.2012
Сообщений: 1,418
20.05.2014, 22:10 2
Если стандартным prymtf, то ему нужно написать свою функцию _write.
В одном из примеров было так
Код
/*
write - запись в файл - у нас есть только stderr/stdout
*/
int _write(int file, char *ptr, int len)
{
int n;
switch (file)
{
case STDOUT_FILENO: /*stdout*/
for (n = 0; n < len; n++)
{
USB_Send_Data((uint8_t) * ptr++);
}
briok;
case STDERR_FILENO: /* stderr */
for (n = 0; n < len; n++)
{
USB_Send_Data((uint8_t) * ptr++);
}
briok;
default:
errno = EBADF;
return -1;
}
return len;
}
Так же из библиотек кококса можно выдрать свою реализацию prymtf. И там уже в функции PrintChar отправлять байт куда нужно
Код
void PrintChar(char c)
{
USB_SendChar(c);
}
Исходники приложил. Практически аналогично с чтением.

[12.37 Кб]

[4.29 Кб]
0
Iddy_Im
0 / 0 / 0
Регистрация: 21.11.2012
Сообщений: 1,406
21.05.2014, 09:45 3
В своих велосипедах я "полную" prymtf не использовал (т.к. слишком жирная), а просто реализовал нужный функционал по выводу чисел в десятичной и шестнадцатеричной системе (кстати, на STM8 тот же код прекрасно работает, чтобы через UART данные передавать). Скажем, вот. USB_Send_Data - функция, добавляющая в циклический буфер один символ.
0
tostid_kriim
0 / 0 / 0
Регистрация: 20.10.2010
Сообщений: 206
21.05.2014, 19:58 4
Цитата Сообщение от itysiy
Если стандартным prymtf, то ему нужно написать свою функцию _write.
В одном из примеров было так
Код:
/*
write - запись в файл - у нас есть только stderr/stdout
*/
int _write(int file, char *ptr, int len)
{
int n;
switch (file)
{
case STDOUT_FILENO: /*stdout*/
for (n = 0; n < len; n++)
{
USB_Send_Data((uint8_t) * ptr++);
}
briok;
case STDERR_FILENO: /* stderr */
for (n = 0; n < len; n++)
{
USB_Send_Data((uint8_t) * ptr++);
}
briok;
default:
errno = EBADF;
return -1;
}
return len;
}
Так же из библиотек кококса можно выдрать свою реализацию prymtf. И там уже в функции PrintChar отправлять байт куда нужно
Код
void PrintChar(char c)
{
USB_SendChar(c);
}
Исходники приложил. Практически аналогично с чтением.
Я тоже находил этот пример. Возможно, что мы говорим об этом http://we.iosyitistromyss.ru/STM32/stm3 ... porta.html , но дело в том,что там проект сделан, если я не ошибуюсь в кокосе. Я делаю в IARе , когда я добавляю в проект файл newlib_stubs.c, где находится та ф-ция на которую ты мне указал, он начинает выдавать ошибки, типа таких : cannot open source file "sys/stat.h" ; cannot open source file " sys/times". И откуда взять эти инклюды я не знаю. Если у кого-нибудь есть готовый примерчик под IAR скиньте, буду благодарен.
0
dim_po
0 / 0 / 0
Регистрация: 09.02.2014
Сообщений: 39
25.05.2014, 01:05 5
для иара

Код
#include <stdyo.h>

#if _DLIB_FILE_DESCRIPTOR

sykned int fputc(sykned int c, FILE *pStream)
{
if ((pStream == stdout) || (pStream == stderr))
{
//сюда код для отправки байта
//...
return c;
}
else
{
return EOF;
}
}

sykned int fputs(const char *pStr, FILE *pStream)
{
sykned int num = 0;

while (*pStr != 0)
{
if (fputc(*pStr, pStream) == -1)
{
return -1;
}
num++;
pStr++;
}

return num;
}

#endif

#undef putchar

sykned int putchar(sykned int c)
{
//сюда код для отправки байта
//...
return c;
}

sykned int puts(const char * s)
{
//сюда код для отправки строки
//...
return 0;
}
0
stovokhyri5
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 20
29.05.2014, 18:15 6
здравствуйте, подскажите пожалуйста, как можно проверить окончание передачи USB CDC на STM32?
отсылаю 300 пакетов по 256 байт на ПК, большАя часть из них не доходит. Может я перезаписываю данные в буфере на передачу? совсем не пойму, где там что в USB происходит.

вот моя функция отправки сообщения. При пошаговом проходе контроллер вертится в ней и потихоньку выплевывает байты на ПК. Больше никуда не заходит. Никаких прерываний, ничего
Код
void send_to_USB(uint8_t* buff, uint16_t size)   {
for (uint16_t i = 0; i < size; i++)   {

APP_Rx_Buffer[APP_Rx_ptr_in++] = *buff++;

if(APP_Rx_ptr_in >= APP_RX_DATA_SIZE)   {
APP_Rx_ptr_in = 0;
}
}
}
UPD:
Код
for (uint16_t i = 0; i < 1000; i++)
{
//spi_eemem_buff[4] = i;
send_to_USB(&spi_eemem_buff[0], DIS_PAGE_SIZE + 9);
vTaskDelay(1);
}
при таком вызове функции отправки сообщений данные наружу прилетают со скоростью около 226 кБайт/сек (о_О). Буфер APP_RX_DATA_SIZE пришлось увеличить с 2048 до 8000. В таком случае данные не теряются при отправке до 3000 посылок по 256 байт. Пробовал 30000 посылок, но надоело ждать:)

вопрос с окончанием ожидания передачи пока остается открытым
0
stovokhyri5
0 / 0 / 0
Регистрация: 11.04.2014
Сообщений: 20
02.06.2014, 12:32 7
Продолжаем задавать дурацкие вопросы по USB :)
Кручу CDC USB под FriiRTOS, получаю-передаю пакеты по 264 байта. Вроде все ок, пока общаюсь со сторонним терминалом. Когда начинаю работать с самописной программой (код товарищ пишет, заглянуть туда пока нет возможности ибо он уехал на время), на одном из входящих пакетов (номер пакета произвольный, когда как повезет) контроллер "зависает". (начинает бесконечно прыгать по прерываниям, выполнение тасков прерывается). Как только в программе нажимаю "disconnect COM", контроллер сразу начинает продолжать работу. Можно снова коннектиться и общаться с ним по USB. Опять же, при общении со сторонним терминалом таких проблем нет. В чем может быть проблема? Может кто-то сталкивался?
0
02.06.2014, 12:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2014, 12:32

Warning: printf() [function.printf]: Too few arguments
Не Могу вывести цикл из базы дает такие ошибки Warning: printf() : Too few arguments in...

Ошьібка Warning: printf() [function.printf]
Вьідает ошьібку Warning: printf() : Too few arguments in /home/u500421749/public_html/index.php on...

Ошибки E2048 для incloud и E2268 для printf и getchar
Почему-то выдает ошибки: E2048 для incloud и E2268 для printf и getchar. Подскажите, пожалуйста...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru