Перейти к содержанию
    

mr_smit

Участник
  • Постов

    68
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о mr_smit

  • Звание
    Участник
    Участник

Посетители профиля

859 просмотров профиля
  1. Ладно, думаю действительно проще будет передавать названия целиком и не заморачиваться. Всем спасибо )
  2. Т.е. при выдаче в USART добавлять номер, а при получении номера обратно, просто считать файлы? И дойдя до нужного номера открывать? Это скорее всего будет очень долго.
  3. Вот именно что присвоенный. Присваивать его в МК не хотелось бы. К тому же не понятно что делать с русскими именами в названиях. Сейчас включена поддержка длинных имен в FatFS и Unicode. Но перед отправкой в USART всё равно приходится делать перекодировку из cp866 в win1251 чтобы правильно отобразить русский текст. Отсылать обратно русское имя и перекодировать его в МК опять же не удобно. Какой нибудь индекс файла в файловой системе решил бы все эти проблемы. В процессе поиска информации наткнулся где то на arduino форум и заметил что там они используют file.dirIndex(). Описания подробного так и не нашел. Вот и подумалось мне что это как то реализуемо. Так я ничего и не скрываю. Есть STM32 подключенный к ПК через преобразователь USART-USB на FT232. В свою очередь к STM32 ещё подключена SD карточка. Задача прочитать содержимое файла на SD карте, но его перед этим надо как то выбрать. Вот и вопрос как более правильно организовать этот выбор.
  4. Со стороны ПК будет самописная программа. Т.е. после получения списка файлов, надо как то обратно сообщить МК какой файл нас интересует. Да, можно отправить целиком название файла, но хотелось бы как то укоротить это до одного номера.
  5. Я наверное не правильно выразился. Терминальная программа это для примера. Меня интересует ЧТО отправить, а не КАК. Это вопрос больше по части кода для микроконтроллера. Как организовать такое взаимодействие. Можно в МК сделать присвоение: 1 - ПАПКА1 2 - Data1.txt 3 - SuperData.txt 4 - BigDataSuperMegaLog.txt 5 - Данные.txt Тогда после того как я отправлю список, в ответ достаточно будет отправить, например, 2, чтобы со стороны микроконтроллера обработать это и определить что пользователь выбрал Data1.txt. Ну а если файлов штук 150 ? Где этот список хранить. Да ещё и с длинными именами. Поэтому я и спрашиваю есть ли какие то "маркеры", чтобы отправлять по USART этот маркер перед названием файла. И не создавать большие массивы для присвоения номера. Т.е. выдать в USART что то типа: 15 - ПАПКА1 324 - Data1.txt 48 - SuperData.txt 194 - BigDataSuperMegaLog.txt 31 - Данные.txt И выбор 194 будет означать BigDataSuperMegaLog.txt. Вроде какие то индексы есть у файлов, но не могу найти информацию на этот счет.
  6. Здравствуйте. Появилась следующая задача: к STM32F103C8T6 подключена SD карта по SPI. Библиотека FatFS. Микроконтроллер читает содержимое карты и выдает список файлов в USART. На ПК в терминальной программе я наблюдаю этот список. Но не могу понять как получить обратную связь от ПК, а именно как указать МК по USART что я выбрал какой либо файл? Пусть, например, на SD карте у меня 4 файла и одна папка. Я наблюдаю их в окне терминальной программы: ПАПКА1 Data1.txt SuperData.txt BigDataSuperMegaLog.txt Данные.txt Как дать понять МК что я выбрал файл "Данные.txt" ? Чтобы он его прочитал и также выдал содержимое в USART. Или что я выбрал ПАПКА1 и МК прочитал содержимое этой папки и так же выдал в USART список файлов в ней. Пересылать названия скорее всего не очень правильная идея. Организовать буфер в МК и присвоить каждому файлу свой номер - не хватит ОЗУ. Может есть в FatFS какие то индексы у файлов? Читаю список так:
  7. Фраза из даташита: "Valid Output With as Little as 50 mV Input Voltage Difference". Только боюсь уровни у неё не те.
  8. Нет. Нужна и передача. Припаялся к ножкам Tx и Rx микросхемы HA12241FP внутри магнитолы. На выходе прекрасный сигнал 0-5 В. Пока вижу 2 варианта: 1. Выпаять трансивер из чейнджера. Чейнджер в мусор. 2. Найти аналог HA12241FP. Уж за 12 лет должны были что то подобное придумать. Хотя кто знает.
  9. В магнитоле для этого используется микросхема HA12241FP. Даташита на неё не нашел, нашел только на HA12240FP. Разница только в одной цифре, но смысл думаю тот же: datasheet_HA12240FP.pdf Это драйвер шины с токовым выходом! Какой современный аналог взять? Не могу найти. P.S. В 2003 году такой CD эмулятор собирали, но там использовали схему на компараторе для чтения данных. Я её тоже навесным монтажом собрал, подключил и вот: Но хочется принимать и передавать через одну микросхему. Подскажите какую взять?
  10. Ради спортивного интереса решил сделать эмулятор CD чейнджера для своей старенькой магнитолы Pioneer 88. Посмотрел обмен на шине. Там похоже CAN шина: Амплитуда сигнала 100 мВ. Как этот сигнал привести к уровню 0-5 или 0-3.3 вольта? Т.е. вот тут амплитуда 1 вольт: А у меня 100 мВ. Пробовал трансивер TJA1050, но он на выходе дает TTL сигнал амплитудой 200 мВ. Естественно ни логический анализатор ни контроллер не воспринимает этот уровень. Как получить 0-5 В ?
  11. И всё равно я не могу передать изображение :( Взял png изображение размером 2179 байт. Открыл через HEX редактор. Создал массив байт: const char Img [2179] = { 0x89,0x50,0x4E,0x47,0x0D... ... }; И пробую передать по запросу в браузер. В состоянии http_state[sn]==HTTP_IDLE формирую заголовок: if(strcmp(url,"/test.png")==0) { strcpy((char*)buf,http_200); strcat((char*)buf, http_server); strcat((char*)buf,"Connection: close\r\n"); strcat((char*)buf,"Content-Length: "); itoa(sizeof(Img),str); strcat((char*)buf,str); strcat((char*)buf,"\r\n"); strcat((char*)buf,"Content-Type: image/png\r\n"); strcat((char*)buf, http_header_end); header_sz=strlen((char*)buf); http_state[sn]=HTTP_SENDING; } В состоянии http_state[sn]==HTTP_SENDING отправляю изображение по частям: if(http_state[sn]==HTTP_SENDING) { ret = send(sn,buf,header_sz); // заголовок ret = send(sn,&Img[0],2048); // первые 2048 байт изображения ret = send(sn,&Img[2048],130); // остаток HTTP_reset(sn); disconnect(sn); } В итоге при обращении по адресу 192.168.1.25/test.png браузер показывает изображение, но только эти первые 2048 байт. Последние байты не отображаются. Т.е. не передаются. Я не понимаю почему так. Хоть убейте. Почему при вызове функции send второй раз она ничего не передает??
  12. stm32 uart kline 5baud slow init

    Вы уже столько кода привели что в каждую строчку не вникнешь. Я говорил про саму идею реализации. Где возможны грабли. Если вы это всё уже учли, то это хорошо. Надо дальше искать. P.S. Тем не менее не понимаю почему бы не подключить бортовик к зажиганию и не морочить дальше голову.
  13. stm32 uart kline 5baud slow init

    Поддержу. Это бы желательно проверить. Типо обрыв это нифига не выкл/вкл. После включения ЭБУ как минимум 300 мс "запускается". Об этом даже в протоколе говорится. Нельзя раньше 300 мс после включения ничего слать. Поэтому, возможно, вы просто не выжидаете эти 300 мс и делаете сброс, а пока инициализация STM-ки закончится, тут уже и ЭБУ просыпается. Сколько ваши "5 таймаутов" длятся? Включайте свою поделку одновременно с зажиганием. Я, в своё время, просто от замка зажигания запитал бортовик и всё. Включили зажигание - подключились, показали параметры. Выключили зажигание - бортовик потух. Один хрен ЭБУ выходит на связь только при включенном зажигании. К чему весь этот велосипед с "делаю ресет".
  14. stm32 uart kline 5baud slow init

    Да, подзабыл. Судя по всему то что работает это чистая случайность. Никаких обрывов быть не должно. Не знаю как там у японцев, но я когда бортовик себе под BOSCH делал - никаких обрывов не было. Связь очень стабильная. Мне кажется вы что то перемудрили с USARTом оттого и глючит. Ну вот элементарно: Usart_Send_symbol(0x70, KLINE_UART); вставлять это в прерывании, мягко говоря, не правильно. Ни на AVR ни на STM32. А это что? void UART4_IRQHandler() { ... if(USART_GetITStatus(UART4, USART_SR_ORE) == SET) { USART_ReceiveData(UART4); } } Я бы так сделал: #define Connect 1 #define ReadData 2 int mode; #define BUFFER_SIZE 200 unsigned char buffer[BUFFER_SIZE]; // приемный буфер volatile unsigned char counter; // счетчик принятых байт // прерывание USART if если байт успешно приняли { buffer[counter] = data; // положили его в буфер if (++counter == BUFFER_SIZE) { counter = 0; } } void main(void) { ... while (1) { switch (mode) // смотрим в каком режиме находимся { case Connect: // если только что включились => подключаемся к ЭБУ // // если всё хорошо // mode = ReadData; // переходим в режим чтения информации case ReadData: // // отправляем -> читаем // } } } В прерывании USART надо только положить байт в буфер и больше ничего. P.S. А вообще можно и обычный Init сделать и не заморачиваться с этим fast 5 baud. Единственное старые мозги могут его не поддерживать. Ну ооочень старые. И тогда всё сведется к тому что надо будет дрыгнуть ногой и потом отослать строчку вида 81 10 f1 81 03 на нормальной скорости 10400 и потом на ней же работать. Только адрес ЭБУ подобрать (0-255). На каком откликнется с тем и работать. Я вот с Relault Logan такой финт хочу сделать, только всё руки не доходят.
  15. stm32 uart kline 5baud slow init

    В обработчике прерывания от USART надо сбрасывать флаг прерывания: void UART4_IRQHandler() { uint8_t data; // portBASE_TYPE xStatus; if((UART4->SR & USART_SR_RXNE)) { UART4->SR&=~USART_SR_RXNE; // сбрасываем флаг прерывания data = UART4->DR; ...... Опечатка: не USART4->SR..., а UART4->SR... в вашем случае. Поправил.
×
×
  • Создать...