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

stepper88

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

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

  • Посещение

Весь контент stepper88


  1. Насчет фиксированной скорости - большое спасибо - настрою. DTR во время инициализации подаю нуль и не снимаю - по крайней мере, осциллографом там логическую единицу не увидели. Плюс отправлял команду AT+CSCLK? - вернула нуль. Но еще глянем. Насчет конденсаторов - еще раз внимательно посмотрю схему Посмотрел: решили, что это для часов реального времени и нам не понадобится или же всегда надо? Огромное спасибо за помощь P.S. А из-за чего может упасть уровень сигнала, измеряемый по AT+CSQ?
  2. Схема включения А вот насчет версии прошивки - можете просветить темного, как ее можно глянуть? Сам модем SIM800C S2-10688-Z1L1J - прошивку родную не меняли
  3. Добрый день! Прошу прощения за такое долго молчание - переделали плату со схемой сопряжения из даташита. В том числе - вместо преобразователя уровня (а был именно он) на PowerKey посадили транзистор. Модем завелся, отвечает на команды, но возникла такая проблема - последнее время не всегда приходит Call Ready - на двух сим-картах Мегафон и Билайн, причем раньше проходило нормально. С третьей Билайн приходит Call Ready, но уровень сигнала в ответе на команду AT+CSQ нулевой. Еще одна проблема - после примерно трех-пяти секунд перерыва модем перестает отвечать на команды даже эхо. При этом на запрос настроек спящего режима AT+CSCLK? выдает нуль. Это нормальное поведение модема или где-то еще можно посмотреть среди настроек? Порядок настройки: После передергивания PowerKey МК: AT\r SIM800: AT\r\n RDY +CFUN: 1 +CPIN: READY Call Ready (не всегда, в чем и проблема) SMS Ready (тоже не всегда, даже, если от модема удалось получить Call Ready) МК: AT+CMGD=1 SIM800: OK МК: AT+CPIN=? SIM800: +CPIN: READY MK: AT+CSQ Вот тут в случае получения нулевого результата (+CSQ: 0,0) через 2-3 с ожидания отправляю AT, на которую не всегда откликается и не всегда выдает эхо P.S. С помощью этой симки и этого модема удавалось подключаться к серверу через встроенный TCP/IP стек. Плату передвигали, но не хватали..
  4. Добрый день! Возникла такая проблема - достаточно давно не делали никаких устройств с GSM/GPRS-модулями, а тут понадобилось снова. Решили взять SIM800C, как дешевый и экономичный. В статьях писали о приемственности с более ранними SIM900, так что, решили использовать старую обвзязку, проверенную еще во времена Quectel M10 (тем более, что было указано напряжение питания модуля примерно такое же) Собрали схему. Написал программу инициализации: GPIOA->ODR |=0x0802; //Power on for GSM and set POWERKEY os_dly_wait(500); GPIOA->ODR &=~0x1000; //Reset RTS GPIOB->ODR &=~0x0080; //Reset DTR GPIOA->ODR &=~(1<<11); //Reset POWERKEY os_dly_wait(1000); GPIOA->ODR |=(1<<11); //Set POWERKEY while (GPIOB->IDR &0x20); send_string_buff3("AT\r"); Реализуется такой алгоритм: 1. Включаем питание модема и устанавливаем на входе PowerKey логическую единицу 2. Ждем 500 мс 3. Сбрасываем PowerKey, DTR и RTS в нуль 4. Ждем 1с 5. Устанавливаем PowerKey в единицу 6. Ждем установку логической единицы на линии Status (на схеме стоит буферный инвертор на транзисторе, поэтому ждем, когда на нужном входе будет нуль) 7. Отправляем команду "AT" Модем устанавливает на выходе Status логическую единицу, но не откликается на команду AT - от модуля не поступает никаких сигналов и UART не принимает никаких байтов - даже мусора. Пробовал различные скорости - более-менее стандартные 115200 и 9600, так 19200 - до кучи - ответа нет. Может ли это быть связано с тем, что на модуль подаются сигналы без делителей - 3,3В? Может быть, UART модуля пожгли? Манипуляции с RTS и DTR, доставшиеся в наследство со времен SIM300 убирал, но разницы не было. Для управления используется микроконтроллер STM32F151C6 Модем: SIM800C S2-10688-Z1L1J Заранее спасибо за ответы.
  5. 2alexvu - увы, родной схемы нету. Видел, что есть некий БСПТ-10, который преобразует данный сигнал в токовую петлю 4..20mA или 0..5mA, но, к своему стыду, не догадался поискать его схему - увидел только предложение о продаже, посмотрел характеристики и пошел искать по картинкам похожий датчик. Увы, не увидел. 2khach - то есть, получается, если мы для каждой обмотки надо сделать такой блочок, как показан на приведенном Вами рисунке? Дурацкий вопрос, а есть ли готовое решение в виде микросхемы-измерителя?
  6. В качестве крайней меры решили сделать так, если красивого электронного решения с индуктивным датчиком не найдется.
  7. Добрый вечер, господа! Недавно стали обладателями сервопривода МЭО с индуктивным датчиком положения вала. Хочется этот датчик запустить "малой кровью". Я так понял, что он состоит из двух обмоток с отводом от средины - один вращается, относительно другого. Схему из документации прилагаю. Сперва думал, что получится подключить микросхемку для СКВТ/Резольвьеров, но там везде на рисунках три обмотки - т.е. еще одна обмотка возбуждения. Возможно ли использование таких микросхем - той же AD2S1200 для такого датчика? Или же есть какие-то другие похожие? Блок преобразования угла в 4..20mA попадался, но он питается от 220В - в нашем случае не подойдет, так как хотим уйти от этого напряжения (в том числе и с заменой двигателя) в сторону постоянного. Потому бы хотел услышать совет - можно ли поставить какую-нибудь микросхемку, которая будет преобразовывать сигнал с датчика и, в идеале, отправлять угол поворота по последовательному интерфейсу. С уважением Шаронов Андрей
  8. Спасибо - просто друг в свое время заказывал - сейчас отдал "Делай регулятор" вот и думал, как с помощью него регулировать. Спасибо за совет :-)
  9. Здравствуйте, господа! Недавно у меня появилось оптореле SRR-25 DA. Решил с его помощью сделать регулятор (диммер). Внутри встроена схема обнаружения через нуль, но я не понимаю, как с ней работать. Регулировать мощность хотелось следующим способом - после обнаружения прохождения переменного напряжения через нуль, запускается таймер микроконтроллера и отмеряется задержка, после чего подается сигнал на отключение (фактически ШИМ-регулирование), но как получать сведения о прохождении через нуль от соответствующего блока в реле? P.S. Прошу прощения, что так сумбурно, просто никогда до этого не сталкивался с этой областью
  10. Спасибо! Получилось запустить обоими способами - оставил включение прерываний чере SVC - показалось, что более корректно, хотя не знаю. Но пока будет так.
  11. Очень похоже, но проверить советы смогу только в понедельник.
  12. STM32F103, Keil RTX и USB

    Здравствуйте, господа! Недавно сделали плату с микроконтроллером STM32F103, подключив к нему USB и несколько светодиодов. Попробовал на нем запустить немного видоизмененный пример HID от Keil MCBSTM32 - убрал работу с LCD, изменил выводы подключения светодиодов и вывод, к которому подключен транзистор, подтягивающий D+ к плюсу питания. Пример нормально заработал. Захотелось запустить его под RTX. Код, работающий без RTX: int main (void) { /* configure Push Buttons */ RCC->APB2ENR |= ((1 << 2)); /* enable GPIOA clock */ GPIOA->CRL &= ~0x000000F0; /* PA1 clear */ GPIOA->CRL |= 0x00000080; /* PA1 is Floating Input */ GPIOA->ODR |= 0x02; /* PA1 pull-up */ /* configure LEDs */ RCC->APB2ENR |= (1 << 4); /* enable clock for GPIOC */ GPIOC->CRH &= ~0x000FF000; /* PC11, PC12 clear */ GPIOC->CRH |= 0x00033000; /* PC11, PC12 is output */ USB_Init(); /* USB Initialization */ USB_Connect(__TRUE); /* USB Connect */ while (1); /* Loop forever */ } Код с использованием RTX: void init_task (void) { /* configure Push Buttons */ RCC->APB2ENR |= ((1UL << 2) | (1UL << 4)); /* enable GPIOA, GPIOC clock*/ GPIOA->CRL &= ~0x000000F0; /* PA.1 clear */ GPIOA->CRL |= 0x00000040; /* PA.1 is Floating Input */ /* configure LEDs */ RCC->APB2ENR |= (1 << 4); /* enable clock for GPIOC */ GPIOC->CRH &= ~0x000FF000; /* PC11, PC12 clear */ GPIOC->CRH |= 0x00033000; /* PC11, PC12 is output */ USB_Init(); /* USB Initialization */ USB_Connect(__TRUE); /* USB Connect */ while(1); } /*---------------------------------------------------------------------------- MAIN function *----------------------------------------------------------------------------*/ int main (void) { os_sys_init(init_task); } После перевода примера на RTX при настройке прерывания USB контроллера, программа вываливает в HardFault. Увеличение объема стека задачи или heap не помогло. Кто-нибудь решал такую проблему или проще просто использовать RL-USB? Заранее благодарен
  13. Здравствуйте! Имеется проект скомпилированный Verilog-проект под Xilinx ISE Web 12.1. Подскажите, как его можно экспортировать в формат EDIF? Или каким-то другим способом перенести в Altium Designer. Заранее благодарен! Андрей
  14. Буферы действительно разные, но охота, чтоб задача, которая ожидает RING, не мешала получить ответы на комманды А если с помощью мьютекса не пускать задачу, ожидающую RING, когда идет набор номера или прием смс нормальным будет решением?
  15. to megajohn А как у вас построенна эта обработка асинхронных сообщений? Просто у самого была отдельная задача, которая постоянно опрашивала кольцевой буфер приема на наличие заветных сообщений о звонке или смске. Но при этом возникают проблемы, когда нужно модему самому или позвонить, или отправить смс. Как сделать так, чтоб в этот момент или задача, следящая за RING или смс вообще не лезла в буфер, или же ждала, пока не будет нормально сделан звонок или отправлена смска?
  16. Недавно соорудил управление Quectel M10 аналогии с проектом для MSP430 с сайта AlexandrY (тест GSM-модема) - вроде бы, когда отправляю комманды модему во время звонков или инициализации - все работает нормально. Но не знаю, как сделать отлов сообщений от модема типа RING или сигнала о пришедшей SMS. Подскажите пожалуйста - работаю с Keil RTX на LPC2378.
  17. Прошу прощения, что долго не заходил в тему. На данный момент изобразил две функции воспроизведения wav-файла. Первая была более простой - там просто между отправками отсчетов на цап запускается таймер и отмеряет задержку - прерывание там не используется. memcpy(&size, &buffer[4],4); while (size>128) { fread(buffer, sizeof(char), 128, f); size=size-128; for (t=0;t<128;t++) { DACR=buffer[t]<<8; T1_delay(86); } result=os_evt_wait_or(0x003E, 0); if (result==OS_R_EVT) { fclose(f); return; } } fread(buffer, sizeof(char), size, f); for (t=0;t<size;t++) { DACR=buffer[t]<<8; T1_delay(86); } result=os_evt_wait_or(0x003E, 0); if (result==OS_R_EVT) { fclose(f); return; } fclose(f); result=os_evt_wait_or(0x003E, timeout); } Второй вариант использует прерывания от таймера и два буфера memcpy(&size, &buffer[4],4); fread(buffer, sizeof(char), 256, f); size=size-256; T1TCR=0x01; while (size>128) { switch (empty) { case 0: break; case 1: fread(buffer, sizeof(char), 128, f); empty=0; size=size-128; break; case 2: fread(&buffer[128], sizeof(char), 128, f); empty=0; size=size-128; break; } result=os_evt_wait_or(0x003E, 5); if (result==OS_R_EVT) { T1TCR=0; fclose(f); return; } } switch (empty) { case 0: break; case 1: fread(buffer, sizeof(char), 128, f); empty=0; size=size-128; break; case 2: fread(&buffer[128], sizeof(char), 128, f); empty=0; size=size-128; break; } result=os_evt_wait_or(0x003E, 5); if (result==OS_R_EVT) { T1TCR=0; fclose(f); return; } Обработчик прерывания void T1_Handler (void) __irq { T1IR=0x01; switch (t) { case 128: empty=1; break; case 0: empty=2; break; } DACR=buffer[t++]<<8; VICVectAddr = 0; // Acknowledge Interrupt } Решил вместо двух массивов использовать один, но поочередно записывать в первую и вторую половины массива. Насчет "поумневших" модемов в моем случае оказалось достаточным включить встроенный декодер DTMF модема и он по нажатию каждой кнопки выплевывал сообщение. P.S. прилагаю файл wav.c - в нем функция play_wav() реализует проигрывание файла без использования прерывания от таймера, функция play_wav_int() соответственно с использованием wav.rar
  18. Когда пользователь кладет трубку, модем выдает NO CARIER и как раз это хочу отлавливать в другой задаче.
  19. На схеме распаяли апаратный декодер DTMF - думаю или с него брать данные, или же встроенный DTMF-декодер модема (модем Quectel M10) попробую запрячь
  20. Простите пожалуйста, что не ответил сразу. На работе интернет тормозит сегодня жутко. Пока что сделал сегодня только распаковку файла wav и вывод отсчетво на терминал. У меня вопрос насчет таймера - если я сделаю прерывания с частотой 8 кГц это не порушит операционную систему? Просто устройство должно реализовывать госовое меню по телефону и охота отлавливать реакцию модема - повесил ли пользователь трубку, а может быть, нажал кнопку. С кодеком, к сожалению не получится - плата уже сделана и не хочется сильно вносить изменения в схемотехнику. За идею с буферами спасибо отдельное - вполне возможно, что тоже пробовать буду.
  21. Здравствуйте, господа! Понадобилось в проекте с операционной системой RL-ARM RTX проигрывать wav-файл с карты памяти. Подскажите пожалуйста, как лучше это реализовать. Само устройство сделано на базе LPC2378 (есть подключенная внешняя ОЗУ), звук выводится через ЦАП микроконтроллера. Я посмотрел, для вывода требуется частота отсчетов минимум 8 кГц, но системный тик RTX сейчас 1 милисекунда. Как поступить? Или уменьшать время системного тика, или каким-то образом задействовать еще один таймер и отправлять данные очередного отсчета из обработчика его прерывания? Заранее благодарен
  22. Дабы не плодить темы, пишу сюда. Есть в наличии плата на LPC2378. Карта памяти подключена к модулю MCI по схеме, которую прилагаю к посту. Модуль MCI инициализирую следующим образом: void MCI_init (void) { unsigned char i=0; //процедура инициализации карты памяти PCONP |=(1<<28); //Включаем тактирование модуля MCI //На время инициализации запрещаем все прерывания MCI_MASK0=0; MCI_MASK1=MCI_MASK0; //PINSEL1=0x2280; //Активируем выводы контроллера карт памяти PINSEL1=0x00002A80; PINSEL4=0x0A800000; //Задаем режим тактирования по-умолчанию, сбрасываем требуемые регистры MCI_COMMAND=0; MCI_DATA_CTRL=0; MCI_CLEAR=0x7FF; //Сбрасываем все отложенные прерывания MCI_POWER=0x02; //Подаем напряжение на карту while (!(MCI_POWER & 0x02)); for (i=0;i<100;i++); //Во время идентификации тактовая частота не должна превышать 400 кГц. //После прохождения этой фазы частота тактового сигнала может быть установлена //25 МГц для SD и 20 МГц для MMC SetMCIClock(SLOW_RATE); MCI_POWER |=0x01; } Далее следует инициализация карты памяти unsigned char init_card (void) { unsigned int i=0; if (!(MCI_Go_Idle_State())) //Переход в неактивное состояние return 0; //Карта неизвестна else { if (MCI_Check_Ver()) //Проверка версии по команде CMD8 { send_string2("SD v2\r\n"); if (MCI_Send_ACMD_OP_Cond(OCR_INDEX_V2)) return 2; else return 0; } else { if (!(MCI_Go_Idle_State())) return 0; else { send_string2("SD v1\r\n"); MCI_Go_Idle_State(); MCI_POWER |= (1 << 6 ); // Set Open Drain output control for MMC for ( i=0; i<0x3000; i++ ); //Посылаем команду CMD1 - если карта MCC - она инициализируется if ( MCI_Send_OP_Cond()) return 1; else //В противном случае посылаем команду ACMD41 с параметром OCR_INDEX if (MCI_Send_ACMD_OP_Cond(OCR_INDEX)) return 2; else return 0; } } } } Команда ACMD41 реализуется, как CMD55+ACMD41 Функция отправки CMD55 unsigned char MCI_Send_ACMD( void ) { unsigned int i=0, t=0; unsigned long Argument=0; unsigned long Status=0; unsigned long Data[4]; char buf[8]; if (CardType==2) { Argument = CardRCA; //Используется адрес из команду установки относительного адреса } else { Argument = 0x00000000; //Для ММС используется аргумент 0 } for (t=0; t<0x200; t++) { MCI_SendCmd(CMD55, Argument, SHORT_RESP, 0 ); Status=MCI_GetCmdResp(CMD55, SHORT_RESP, (unsigned long*)&Data[0]); if ((!(Status)) && (Data[0] & CARD_STATUS_ACMD_ENABLE)) { send_string2("CMD55 good\r\n"); return 1; } for (i=0; i<0x50; i++); } memcpy(buf,&Status,4); send_mas2(buf,4); send_string2("CMD55 error\r\n"); return 0; } Функция отправки ACMD41. В процессе своей работы вызывает предыдущую функцию unsigned char MCI_Send_ACMD_OP_Cond (unsigned long Argument) { unsigned int t=0; //Счетчик попыток unsigned int i=0; //Счетчик задержек unsigned long Status=0; //Статус unsigned long Data[4]; //Данные, возвращаемые при запросе //Если процедура Send_Op_Cond вылетела по таймауту (вставлена не карта ММС), //пробуем Send_ACMD_OP_Cond MCI_POWER &= ~(1 << 6 ); /* Clear Open Drain output control for SD */ for ( i = 0; i < 0x3000; i++ ); for (t=0; t<0x200; t++) { if (!(MCI_Send_ACMD())) { continue; } else { MCI_SendCmd( ACMD41, Argument, SHORT_RESP, 0 ); Status=MCI_GetCmdResp(ACMD41, SHORT_RESP, (unsigned long *)&Data[0]); //Нулевой и второй бит должны быть в нуле иначе ошибка CRC или таймаут if (!(Status&MCI_CMD_TIMEOUT) && (Data[0] & 0x80000000)) { return 1; } for ( i=0; i<0x20; i++); //Таймаут для следующей попытки } } return 0; } Карта Tranced 2Гб нормально опознается, как карта SD V2 и проходит инициализацию нормально. Карты же Tranced 256 Мб и Tranced 1 Гб опознаются, как SD V1, но при отправке CMD55 после первой попытки в регистре статуса устанавливаются флаги Command response timeout и Command sent (no response required) - биты 3 и 8 соответственно, при последующих попытках только флаг Command response timeout. Если строки в функции MCI_Send_ACMD() MCI_SendCmd(CMD55, Argument, SHORT_RESP, 0 ); Status=MCI_GetCmdResp(CMD55, SHORT_RESP, (unsigned long*)&Data[0]); заменяю на MCI_SendCmd(CMD55, Argument, NO_RESP, 0 ); Status=MCI_GetCmdResp(CMD55, NO_RESP, (unsigned long*)&Data[0]); в регистре статуса не устанавливается ни одного флага, но и в переменной Data тоже нули. Подскажите пожалуйста, как правильно в таком случае поступить? Можно будет при втором варианте отправки CMD55 просто проверить регистр статуса (что ни один из флагов не выставлен) и сразу переходить к отправке самой ACMD41? Или обязательно нужно получить ответ? P.S. Использую среду Keil, функции отправки комманд, а также чтения ответа на команду и статуса взял из примера к LPC23xx для проверки модуля MCI.
  23. Почему-то у Keil все примеры с использованием функции recv() серверные. Кто-нибудь использовал эту функцию для клиента? Может быть, я что-то неправильно делаю? В частности, в примерах с recv() присутствует функция bind(). Нужна ли она в моем случае?] Изменил начало кода клиента while(1) { sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock>0) { addr.sin_port = 0; addr.sin_family = PF_INET; addr.sin_addr.s_addr = INADDR_ANY; bind (sock, (SOCKADDR *)&addr, sizeof(addr)); time_addr.sin_port = htons(5001); time_addr.sin_family = PF_INET; time_addr.sin_addr.s_b1 = IP1; time_addr.sin_addr.s_b2 = IP2; time_addr.sin_addr.s_b3 = IP3; time_addr.sin_addr.s_b4 = IP4; connect (sock, (SOCKADDR *)&time_addr, sizeof (time_addr)); Теперь при приеме появляется ошибка таймаута (сервер пакет отправляет).
  24. Здравствуйте! Недавно решил попробовать сокеты BSD в составе кейловского стека (Keil uVision 4.5). Необходимо сделать SNTP клиент, который смог бы получать из сети время. Написал вот такой текст: #include "LPC23xx.h" #include "uart.h" #include "RTL.h" #include "main.h" #include <Net_Config.h> //-------- <<< Use Configuration Wizard in Context Menu >>> ----------------- // <h>Time server IP // ==================== // // <o>IP1: Address byte 1 <0-255> // <i> Default: 192 #define IP1 192 // <o>IP2: Address byte 2 <0-255> // <i> Default: 168 #define IP2 168 // <o>IP3: Address byte 3 <0-255> // <i> Default: 0 #define IP3 0 // <o>IP4: Address byte 4 <0-255> // <i> Default: 100 #define IP4 13 // </h> //------------- <<< end of configuration section >>> ----------------------- OS_TID poolID, timerID, SNTPID; int sock; U64 tcp_stack[800/8]; U64 SNTP_stack[800/8]; #define MCLK 48000000 /* Master Clock 48 MHz */ #define TCLK 10 /* Timer Clock rate 10/s */ #define TCNT (MCLK/TCLK/4) /* Timer Counts */ BOOL tick; U32 dhcp_tout; BOOL LCDupdate; extern LOCALM localm[]; /* Local Machine Settings */ #define MY_IP localm[NETIF_ETH].IpAdr #define DHCP_TOUT 50 /* DHCP timeout 5 seconds */ void tcp_task (void) { /* Main Thread of the TcpNet. This task should have */ /* the lowest priority because it is always READY. */ UART2_init(115200); init_TcpNet(); timerID=os_tsk_create (timer_task, 0x20); //poolID=os_tsk_create_user (tcp_task, 0, &tcp_stack, sizeof(tcp_stack)); //os_dly_wait(1000); SNTPID=os_tsk_create_user (SNTP_task, 0x02, &SNTP_stack, sizeof(SNTP_stack)); while (1) { main_TcpNet(); os_tsk_pass(); } } /*--------------------------- timer_poll ------------------------------------*/ void timer_task (void) { os_itv_set (10); while (1) { /* Timer tick every 100 ms */ timer_tick (); tick = __TRUE; os_itv_wait (); } } void SNTP_task (void) { //static int sock; int res; int addrlen; SOCKADDR_IN time_addr; char tx_buf[50]; char rx_buf[50]; tx_buf[0]=0x23; //SNTPV4 client send_string2("SNTP task started\r\n"); addrlen = sizeof (time_addr); while(1) { sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sock>0) { time_addr.sin_port = htons(123); time_addr.sin_family = PF_INET; time_addr.sin_addr.s_b1 = IP1; time_addr.sin_addr.s_b2 = IP2; time_addr.sin_addr.s_b3 = IP3; time_addr.sin_addr.s_b4 = IP4; connect (sock, (SOCKADDR *)&time_addr, sizeof (time_addr)); while(1) { res = sendto (sock, (char *)&tx_buf, 48, 0, (SOCKADDR *)&time_addr, addrlen); if (res <0) { break; } send_string2("Get-time request sent\r\n"); res = recv (sock, rx_buf, 48, 0); if (res <0) { switch (res) { case SCK_EINVALID: send_string2("socket invalid\r\n"); break; case SCK_ECLOSED: send_string2("remote host closed connection\r\n"); break; case SCK_EWOULDBLOCK: send_string2("function would be locked\r\n"); break; case SCK_ETIMEOUT: send_string2("Timeout\r\n"); break; case SCK_ELOCKED: send_string2("function blocked by RTX\r\n"); break; } break; } os_dly_wait(300); } closesocket (sock); os_dly_wait(300); } else { send_string2("Create socket error!\r\n"); while(1); } } } int main (void) { os_sys_init_user (tcp_task, 0, &tcp_stack, sizeof(tcp_stack)); } Отправка сообщения серверу командами send() или sendto() проходит нормально - кадр передается на компьютер и там принимается без проблем. При приеме функции recv() и recvfrom() вываливаются с ошикбой SCK_EINVALID (-2). Если закомментировать участок отправки данных, все равно получаем ту же ошибку. Настройки Net_Config.h Сокеты UDP 2, TCP 1. Включены сокеты BSD: BSD сокетов 1, таймаут 20с (по-умолчанию). В чем может быть проблема? Заранее спасибо! P.S. Обновил до Keil 4.53 (что-то поправили в функции recv()) - не помогло.
  25. Здравствуйте, господа! Использую Keil uVision 4.14 и LPC2378 (сетевая часть содрана с MCB2300) Запустил стек TCPNet под операционной системой Keil RTX - переделал пример SNMP-агента. Чтение и запись SNMP переменных работает нормально, а вот с trap не получается. Основываясь на документации Keil, написал вот такую функцию отправки trapов. BOOL snmp_trap ( U8* man_ip, /* Указатель на IP-адрес trap-менеджера */ U8 gen_trap, /* Общее значение trap */ U8 spec_trap, /* Специфическое значение trap */ U16* obj_list ); /* Указатель на список объектов */ int send_trap_one (U16 data) { /* Send a trap message when alarm input is activated.*/ U16 obj[2]; //Добавление данных в trap-запрос obj[0] = 1; obj[1] = data; if (snmp_trap (NULL, 6, 1, obj)) return 1; else return 0; } однако, трап-запросы приходят через раз или еще реже. Без операционной системы программа нормально работала, с операционной же системой не получается. При этом функция возвращает значение true Что уже попробовал: Для задачи, которая вызывает функцию отправки trap увеличил объем стека с 200 байт до 1000. Пробовал менять приоритет: timer_task имеет приоритет 0х20 tcp_task имеет приоритет 0 ставил приоритет 0х20 и 0х30 - не меняется Заранее спасибо за помощь
×
×
  • Создать...