LPC1768+RTOS+KEIL+HTTP CGI (управление мк через WEB) updated

Вдохновленный топиком ув.Lifelover решил вернуться к теме управления контроллером, посредством установленного в нем HTTP Server-а.
Тем более что ко мне едет супер железяка на основе которой я и планирую сделать типа умный дом с контролем и управлением через WEB.







Но так как человек я ленивый, а контроллер у меня «жирный», мельчить не стану, буду использовать во всю картинки для красивости и библиотеку от кейла RL.

Пока железяка едет почтой России, тренироваться буду на своем mbed NXP LPC1768, для начала контроль и управление 3-я свободными светодиодами.

Взял Front Page, можно и Notepad, кому что привычней, и набросал пару страниц. Стартовую и страницу управления светодиодами. На скорую руку, для проверки. Формы не вставлял, просто разбил пустые таблички по них, Сами формы впишем поздней, из кейла. Файлы, в которых будут устанавливаться значения согласно установкам
контроллера, присутствуют формы для посылки данных контроллеру, сразу обзываем расширением CGI.

За базу программы, взял код из предыдущего своего топика, там была RTOS, куча ненужного и TCP/IP stack. Все из состава кейловской библиотеки RL. HTTP сервер там работал но был пустой.

Создаем папочку, скажем WEB, кладем туда свои файлы htm, cgi, и добавляем их в проект, и Htm-файлы и картинки и звуки (если есть), добавляем все как текстовые документы. В той же папочке создаем файл WEB.IMP, в свойствах его указываем как Custom file, а в строчке Custom Arguments вписываем строку C:\Keil\ARM\bin\fcarm @@Web\Web.inp, где после @@указываем путь к своему WEB.IMP.

В WEB.IMP вписываем названия всех своих web файлов через запятую, первый указанный файл будет стартовым. У меня получилось index.htm, leds.cgi, mbedMicrocontroller.gif, pinout.gif to Web.c nopr root(Web).
И пробуем скомпилить проект. Если ошибок не будет, то в папке WEB создастся файл WEB.C, его нужно тоже добавить в проект.

Теперь заливаем все в контроллер и заходим IE по адресу указанному ранее в Net_Config.c, увидим свою страничку, пока статичную.

Что в итоге я хотел получить.
Читать данные с мк и передавать данные мк. За все это дело в библиотеке кейла RL отвечает три функции.
void cgi_process_var (U8 *qs) — вызывается если нажата кнопка формы SUBMIT метода GET;
void cgi_process_data (U8 code, U8 *dat, U16 len) — вызывается если нажата кнопка формы SUBMIT метода POST;
U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) — вызывается всегда.

С помощью первых двух можно принять и обработать данные забитые в форму ввода на html-страничке, с помощью последней можно подменить
данные идущие от сермера браузеру и заставить его отбразить то что нужно нам.
Эти функции срабатывают если вызывается страничка с расширение CGI, а что именно обрабатывать на странице указывают особым способом. В начало каждой строки html страницы ставиться буква t или c, есть еще буквы\символы, но я их не использовал.

В итоге, после «обработки», обычный html код превращается в:


t <HTML>
t <head>
t <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
t <meta http-equiv="Content-Language" content="ru">
t <title>mkWEB Server - LEDs</title>
t </head>
t <body style="text-align: center">
t <table border="1" width="100%" id="table3" style="border-width: 0px">
t <tr>
t <td style="border-style: none; border-width: medium">
t <div align="center">
t <img border="0" src="mbedMicrocontroller.gif" width="172" height="149">
t <table border="1" width="800" id="table4" style="border-width: 0px">
t <tr>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00">
t <a href="index.htm"><span style="text-decoration: none">
t <font color="#000000">Главная</font></span></a></td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00">
t <span lang="en-us"><font color="#000000">
t <span style="text-decoration: none">LEDs</span></font></span></td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t </tr>
t </table>
t </div>
t </td>
t </tr>
t </table>
t <table border="1" width="100%" id="table7" style="border-width: 0px">
t <tr>
t <td style="border-style: none; border-width: medium">
t <p align="center">
t <img border="0" src="pinout.gif" width="610" height="383"></p>
t <p align="center"> </td>
t </tr>
t </table>
t <table border="1" width="100%" id="table5" style="border-width: 0px">
t <tr>
t <td style="border-style: none; border-width: medium">
t <div align="center"><a name="leds"></a>
t <table border="1" width="800" id="table6" style="border-width: 0px">
t <tr>
t <td align="center" width="260" style="border-style: none; 
c a border-width: medium" bgcolor="%s">
c b <p align="center"><span lang="en-us">LED #1 = %s</span></p>
t <p align="center">
t <FORM ACTION="leds.cgi#leds" METHOD="POST" NAME="CGI">
t <TABLE>
t <TR>
t <TD>
c b <INPUT TYPE="TEXT" id="textbox1" name="textbox1" SIZE="16" VALUE="%s"></TD>
t <TD ALIGN="right">
t <INPUT TYPE="SUBMIT" id="change1" name="change1" VALUE="SET 1/0"></TD>
t </TR>
t </TABLE>
t </FORM>
t </p></td>
t <td align="center" width="260" style="border-style: none; 
c c border-width: medium" bgcolor="%s">
c d <p align="center"><span lang="en-us">LED #2 = %s</span></p>
t <p align="center">
t <FORM ACTION="leds.cgi#leds" METHOD="POST" NAME="CGI">
t <TABLE>
t <TR>
t <TD>
c d <INPUT TYPE="TEXT" id="textbox2" name="textbox2" SIZE="16" VALUE="%s"></TD>
t <TD ALIGN="right">
t <INPUT TYPE="SUBMIT" id="change2" name="change2" VALUE="SET 1/0"></TD>
t </TR>
t </TABLE>
t </FORM>
t </p></td>
t </td>
t <td align="center" width="260" style="border-style: none; 
c e border-width: medium" bgcolor="%s">
c f <p align="center"><span lang="en-us">LED #3 = %s</span></p>
t <p align="center">
t <FORM ACTION="leds.cgi#leds" METHOD="POST" NAME="CGI">
t <TABLE>
t <TR>
t <TD>
c f <INPUT TYPE="TEXT" id="textbox3" name="textbox3" SIZE="16" VALUE="%s"></TD>
t <TD ALIGN="right">
t <INPUT TYPE="SUBMIT" id="change3" name="change3" VALUE="SET 1/0"></TD>
t </TR>
t </TABLE>
t </FORM>
t </p></td>
t </td>
t </tr>
t </table>
t </div>
t </td>
t </tr>
t </table>
t </body>
t </HTML>
.

В конце не забываем точку.

Символ t означает что строчка будет передана браузеру без изменений, символ с означает что эта строчка должна быть обработана.
Чтобы вавести в какое то место страницы то что мы хотим, нужно это строчку начать символом с, через пробел добавить буквенноциферный идентификатор, по которому будем в коде определять что это за строчка и что именно туда вставлять, а в самой строчке в нужном месте ставим %s, чтобы вывести строчку.
Должно получиться типа:

c b <p align="center"><span lang="en-us">LED #1 = %s</span></p>. 

А для наглядности можно просто выделить это в одну строчку и получиться:

c b <p>%s</p>.

За вывод в браузер отвечает функция U16 cgi_func, она прописана в Net_Config.h, поэтому не забываем добавить в начало кода #include «Net_Config.h», ну и заодно #include «string.h» и #include «stdio.h».
И пишем:

U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) 
{
   U32 len = 0;

   switch (env [0]) 
   {
      case 'b':
      {
         len = sprintf ((S8 *) buf, (const S8 *) &env [2], "TEST");
      }
      break;
		
   }
   return ((U16) len);
}

После чего, загружая в браузере нашу CGI страницу, будем в назначеном нами месте видеть «TEST».
Теперь дело за вводом информации в мк.

main.c

#include "LPC17xx.h"
#include "RTL.h"
#include "stdio.h"
#include "string.h"
#include "Net_Config.h"

#define EVT_RTC_SEC 0x0100
#define EVT_LIFE_LED 0x0101

unsigned long long tcp_stack[1024/8];

const unsigned long led_mask[] = { 1UL<<23, 1UL<<21, 1UL<<20, 1UL<< 18 };

char LED1stat = 0;
char LED2stat = 0;
char LED3stat = 0;

LPC_UART_TypeDef *pUart;

typedef struct {
    uint32_t RTC_Sec;     /* Second value - [0,59] */
    uint32_t RTC_Min;     /* Minute value - [0,59] */
    uint32_t RTC_Hour;    /* Hour value - [0,23] */
    uint32_t RTC_Mday;    /* Day of the month value - [1,31] */
    uint32_t RTC_Mon;     /* Month value - [1,12] */
    uint32_t RTC_Year;    /* Year value - [0,4095] */
    uint32_t RTC_Wday;    /* Day of week value - [0,6] */
    uint32_t RTC_Yday;    /* Day of year value - [1,365] */
} RTCTime;

RTCTime CurrentTime = {0,1,1,1,1,2011};

OS_TID t_DEBUG_PRINT;
OS_TID t_RTC_TIME;
OS_TID t_LIFE_LED;
OS_TID t_TIMER_HTTP;
OS_TID t_HTTP;

void RTCSetTime( RTCTime Time )
{
   LPC_RTC->SEC = Time.RTC_Sec;
   LPC_RTC->MIN = Time.RTC_Min;
   LPC_RTC->HOUR = Time.RTC_Hour;
   LPC_RTC->DOM = Time.RTC_Mday;
   LPC_RTC->DOW = Time.RTC_Wday;
   LPC_RTC->DOY = Time.RTC_Yday;
   LPC_RTC->MONTH = Time.RTC_Mon;
   LPC_RTC->YEAR = Time.RTC_Year;   
}

RTCTime RTCGetTime( void )
{
   RTCTime LocalTime;
 
   LocalTime.RTC_Sec = LPC_RTC->SEC;
   LocalTime.RTC_Min = LPC_RTC->MIN;
   LocalTime.RTC_Hour = LPC_RTC->HOUR;
   LocalTime.RTC_Mday = LPC_RTC->DOM;
   LocalTime.RTC_Wday = LPC_RTC->DOW;
   LocalTime.RTC_Yday = LPC_RTC->DOY;
   LocalTime.RTC_Mon = LPC_RTC->MONTH;
   LocalTime.RTC_Year = LPC_RTC->YEAR;

   return ( LocalTime );   
}

void RTC_IRQHandler (void)
{
   LPC_RTC->ILR |= 0x01;
   isr_evt_set (EVT_RTC_SEC, t_RTC_TIME);
}

void DeviceInit (void)
{
   LPC_GPIO1->FIODIR = (1<<23) | (1<<21) | (1<<20) | (1<<18);

   LPC_PINCON->PINSEL0 |= (1 << 4);             
   LPC_PINCON->PINSEL0 |= (1 << 6);             
   pUart = (LPC_UART_TypeDef *)LPC_UART0;
   pUart->LCR    = 0x83;                          
   pUart->DLL    = 9;                             
   pUart->FDR    = 0x21;                          
   pUart->DLM    = 0;                             
   pUart->LCR    = 0x03;                          
   LPC_SC->PCONP |= (1 << 9);
   if ( LPC_RTC->RTC_AUX & (0x1<<4) )
   {
      LPC_RTC->RTC_AUX |= (0x1<<4);
   }
   LPC_RTC->AMR = 0;
   LPC_RTC->CIIR = 1; 
   LPC_RTC->CCR = 0x10;
   RTCSetTime(CurrentTime);
   LPC_RTC->CCR |= 0x01;
   NVIC_EnableIRQ(RTC_IRQn) ;
}

int SER_putChar (int uart, U8 c) 
{
   LPC_UART_TypeDef *pUart;
   pUart = (uart == 0) ? (LPC_UART_TypeDef *)LPC_UART0 : (LPC_UART_TypeDef *)LPC_UART1;
   while (!(pUart->LSR & 0x20));
   return (pUart->THR = c);
}

void SER_putString (int uart, U8 *s) 
{	  
   while (*s != 0) 
   {
      SER_putChar(uart, *s++);
   }
}

void LEDon (unsigned int num)
{
   LPC_GPIO1->FIOPIN |= led_mask[num];
   if (num == 1)
   {
      LED1stat = 1;
   }
   if (num == 2)
   {
      LED2stat = 1;
   }
   if (num == 3)
   {
      LED3stat = 1;
   }
}

void LEDoff (unsigned int num)
{
   LPC_GPIO1->FIOPIN &= ~led_mask[num];
   if (num == 1)
   {
      LED1stat = 0;
   }
   if (num == 2)
   {
      LED2stat = 0;
   }
   if (num == 3)
   {
      LED3stat = 0;
   }
}

U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) 
{
   U32 len = 0;

   switch (env [0]) 
   {
      case 'a':
      {
         if (LED1stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#FF0000");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#00FF00");
         }
      }
      break;
      case 'b':
      {
         if (LED1stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "0");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "1");
         }
      }
      break;
      case 'c':
      {
         if (LED2stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#FF0000");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#00FF00");
         }
      }
      break;
      case 'd':
      {
         if (LED2stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "0");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "1");
         }
      }
      break;
      case 'e':
      {
         if (LED3stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#FF0000");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#00FF00");
         }
      }
      break;
      case 'f':
      {
         if (LED3stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "0");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "1");
         }
      }
      break;
      case 'g':
      {
         if (LED1stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#FFFFFF");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#0066FF");
         }
      }
      break;
      case 'h':
      {
         if (LED2stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#FFFFFF");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#0066FF");
         }
      }
      break;
      case 'j':
      {
         if (LED3stat ==0)
         { 
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#FFFFFF");
         }
         else
         {
            len = sprintf ((S8 *) buf, (const S8 *) &env [2], "#0066FF");
         }
      }
      break;
   }
   return ((U16) len);
}

void cgi_process_data (U8 code, U8 *dat, U16 len) 
{
   U8 *var;
 
   var = (U8 *) alloc_mem (40);
   do 
   {
      dat = http_get_var (dat, var, 40);
      SER_putString (0, var);
      if (var [0] != 0 ) 
      {
         if (str_scomp (var, "textbox1=1") == __TRUE) 
         {
            LEDon (1);				
         }
         if (str_scomp (var, "textbox1=0") == __TRUE) 
         {
            LEDoff (1);				
         }
         if (str_scomp (var, "textbox2=1") == __TRUE) 
         {
            LEDon (2);				
         }
         if (str_scomp (var, "textbox2=0") == __TRUE) 
         {
            LEDoff (2);				
         }
         if (str_scomp (var, "textbox3=1") == __TRUE) 
         {
            LEDon (3);				
         }
         if (str_scomp (var, "textbox3=0") == __TRUE) 
         {
            LEDoff (3);				
         }
      }
   } while (dat);
   free_mem ((OS_FRAME *)var);
}

__task void f_LIFE_LED (void) 
{
   char i = 1;
   while (1) 
   {
      os_evt_wait_or (EVT_LIFE_LED, 0xffff); 
      if (i)
      {
         LEDon(0);
         i=!i;
      }
      else
      {
         LEDoff(0);
         i=!i;
      }        
   }
}

__task void f_RTC_TIME (void) 
{
   while (1) 
   {
         os_evt_wait_or (EVT_RTC_SEC, 0xffff);

         os_evt_set (EVT_LIFE_LED, t_LIFE_LED);
   }
}

__task void f_TIMER_HTTP (void) 
{
   os_itv_set (10);
   while (1) 
   {
      timer_tick ();
      os_itv_wait ();
   }
}

__task void f_HTTP (void) 
{
   while (1) 
   {
      main_TcpNet();
      os_tsk_pass();          
   }
}

__task void f_DEBUG_PRINT (void) 
{
   while (1) 
   {
      os_dly_wait (100);         
   }
}

__task void init (void) 
{
   os_tsk_prio_self (100);

   SystemInit ();
   DeviceInit ();
   init_TcpNet ();

   SER_putString (0, "\n\nRTOS Starting ...   \n\n");

   t_DEBUG_PRINT = os_tsk_create (f_DEBUG_PRINT, 3);
   SER_putString (0, "DEBUG_PRINT started\n");
   t_RTC_TIME = os_tsk_create (f_RTC_TIME, 50);
   SER_putString (0, "RTC_TIME started\n");
   t_LIFE_LED = os_tsk_create (f_LIFE_LED, 2);
   SER_putString (0, "LIFE_LED started\n");
   t_TIMER_HTTP = os_tsk_create (f_TIMER_HTTP, 99);
   SER_putString (0, "TIMER_HTTP started\n");
   t_HTTP = os_tsk_create_user (f_HTTP, 1, &tcp_stack, sizeof(tcp_stack));
   SER_putString (0, "HTTP started\n");
	
   SER_putString (0, "\n\nOK!\n\n");
		
   os_tsk_delete_self ();
}

int main (void)
{
   os_sys_init(init);
}


web.inp

index.htm, leds.cgi, mbedMicrocontroller.gif, pinout.gif to Web.c nopr root(Web)


index.htm

<HTML>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta http-equiv="Content-Language" content="ru">
<title>mkWEB Server - Main</title>
</head>

<body style="text-align: center">

<table border="1" width="100%" id="table1" style="border-width: 0px">
	<tr>
		<td style="border-style: none; border-width: medium">
		<div align="center">
			<img border="0" src="mbedMicrocontroller.gif" width="172" height="149"><table border="1" width="800" id="table2" style="border-width: 0px">
				<tr>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00">
					Главная</td>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00">
					<span lang="en-us"><a href="leds.cgi">
					<span style="text-decoration: none"><font color="#000000">LEDs</font></span></a></span></td>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
					<td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
				</tr>
			</table>
		</div>
		</td>
	</tr>
</table>
<table border="1" width="100%" id="table3" style="border-width: 0px">
	<tr>
		<td style="border-style: none; border-width: medium">
		<p align="center">
		<img border="0" src="pinout.gif" width="610" height="383"></td>
	</tr>
</table>
</body>
</HTML>


leds.cgi

t <HTML>
t <head>
t <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
t <meta http-equiv="Content-Language" content="ru">
t <title>mkWEB Server - LEDs</title>
t </head>
t <body style="text-align: center">
t <table border="1" width="100%" id="table3" style="border-width: 0px">
t <tr>
t <td style="border-style: none; border-width: medium">
t <div align="center">
t <img border="0" src="mbedMicrocontroller.gif" width="172" height="149">
t <table border="1" width="800" id="table4" style="border-width: 0px">
t <tr>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00">
t <a href="index.htm"><span style="text-decoration: none">
t <font color="#000000">Главная</font></span></a></td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00">
t <span lang="en-us"><font color="#000000">
t <span style="text-decoration: none">LEDs</span></font></span></td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t <td align="center" width="100" style="border-style: none; border-width: medium" bgcolor="#00FF00"> </td>
t </tr>
t </table>
t </div>
t </td>
t </tr>
t </table>
t <table border="1" width="100%" id="table7" style="border-width: 0px">
t <tr>
t <td style="border-style: none; border-width: medium">
t <p align="center">
t <img border="0" src="pinout.gif" width="610" height="383"></p>
t <p align="center"> </td>
t </tr>
t </table>
t <table border="1" width="100%" id="table5" style="border-width: 0px">
t <tr>
t <td style="border-style: none; border-width: medium">
t <div align="center"><a name="leds"></a>
t <table border="1" width="800" id="table6" style="border-width: 0px">
t <tr>
t <td align="center" width="260" style="border-style: none; 
c a border-width: medium" bgcolor="%s">
c b <p align="center"><span lang="en-us">LED #1 = %s</span></p>
t <p align="center">
t <FORM ACTION="leds.cgi#leds" METHOD="POST" NAME="CGI">
t <TABLE>
t <TR>
t <TD>
c b <INPUT TYPE="TEXT" id="textbox1" name="textbox1" SIZE="16" VALUE="%s"></TD>
t <TD ALIGN="right">
t <INPUT TYPE="SUBMIT" id="change1" name="change1" VALUE="SET 1/0"></TD>
t </TR>
t </TABLE>
t </FORM>
t </p></td>
t <td align="center" width="260" style="border-style: none; 
c c border-width: medium" bgcolor="%s">
c d <p align="center"><span lang="en-us">LED #2 = %s</span></p>
t <p align="center">
t <FORM ACTION="leds.cgi#leds" METHOD="POST" NAME="CGI">
t <TABLE>
t <TR>
t <TD>
c d <INPUT TYPE="TEXT" id="textbox2" name="textbox2" SIZE="16" VALUE="%s"></TD>
t <TD ALIGN="right">
t <INPUT TYPE="SUBMIT" id="change2" name="change2" VALUE="SET 1/0"></TD>
t </TR>
t </TABLE>
t </FORM>
t </p></td>
t </td>
t <td align="center" width="260" style="border-style: none; 
c e border-width: medium" bgcolor="%s">
c f <p align="center"><span lang="en-us">LED #3 = %s</span></p>
t <p align="center">
t <FORM ACTION="leds.cgi#leds" METHOD="POST" NAME="CGI">
t <TABLE>
t <TR>
t <TD>
c f <INPUT TYPE="TEXT" id="textbox3" name="textbox3" SIZE="16" VALUE="%s"></TD>
t <TD ALIGN="right">
t <INPUT TYPE="SUBMIT" id="change3" name="change3" VALUE="SET 1/0"></TD>
t </TR>
t </TABLE>
t </FORM>
t </p></td>
t </td>
t </tr>
t </table>
t </div>
t </td>
t </tr>
t </table>
t </body>
t </HTML>
.


Продолжение будет… а пока весь код в кучу, позднее опишу.
  • 0
  • 14 апреля 2011, 18:19
  • lexanet
  • 1
Файлы в топике: SK-LPC1768_EMAC.zip

Комментарии (33)

RSS свернуть / развернуть
Здравствуйте!
Передо мной стала задача управлять с компьютера по средствам lpc1768 неким оборудованием…
Но так как с ARM микроконтроллерами до этого не имел дело — не получается даже собрать по Вашему примеру проект :(
Если возможно, сбросьте его пожалуйста на amiid90@mail.ru
или на hebudumka25@mail.ru
Буду премного благодарен.
0
Что именно не собирается? В чем затык? Помогу, подскажу. Проекта нет, это было давно и делалось для пробы.
0
:)
видно придется тебе заново написать и выложить проект.
0
Заново нет. Счас делаю штуку, две платы LPC1768 и STM32f217) + плата с SIM508. На каждой плате будет WEB — морда с выводом и вводом информации. Если время у человека не поджимает, может подождать и тогда выложу проект. А если времени мало, прошу с вопросами в личку, помогу.
Вообще, пример «детский». Не собираться может только если библиотека RL к KEIL-у не прикручена.
0
Подскажите пожалуйста, какие были подключены файлы в дереве проекта…
… ругается на ссылки из main.o…
и я надеюсь это поможет :)

Кстати, не пойму где добавленные *.htm и др. файлы в Web.c используются в проекте…

P.S. Если есть примеры или знаете где можно посмотреть элементарные способы управления этим МК по Ethernet? был бы рад увидеть :). А так же интересовался заведением Web-сервера и Telnet-сервера на базе стека uIP, но тоже ничего конкретного собрать не получилось, может по этому поводу чего подскажете…

В общем буду рад любой информации, т.к. Ваши статьи — самое вразумительное, что я нашел :)
0
Советую заглянуть в книгу «Микроконтроллеры ARM7 семейства LPC2300/2400.Вводный курс разработчика».
Глава5.П/п 5.2.6 «Создание веб интерфейса с использованием коммерческого стека ТСР/ІР»
0
Спасибо загляну!
Рождается еще один вопрос… Различия в семействах ARM7 и Cortex-M3 — значительны по этому поводу?
0
Различия имеются. Естественно настройки конфигурации разные. Суть не в этом. Вы используюете готовые библиотеки RL от Keil для конфигурирования своего МК — HTTP, FTP, CAN и т.д.
0
Лучшая дока — это примеры самого кейла (C:\Keil\ARM\Boards\Keil\MCB1700), родной хелп (C:\Keil\ARM\Hlp\rlarm.chm) и PDF-ка от кейла по своей RL библиотеке. Куцо, сжато, малопонятно, но, ничего большего нет :)
WEB-файлы компилируются в WEB.c и добавляются в проект. А потом используются встроенным WEB сервером. А ввод или вывод информации на/со страниц обеспечивает уже пользовательский код с помощью 3-х функций:
void cgi_process_var (U8 *qs) — вызывается если нажата кнопка формы SUBMIT метода GET;
void cgi_process_data (U8 code, U8 *dat, U16 len) — вызывается если нажата кнопка формы SUBMIT метода POST;
U16 cgi_func (U8 *env, U8 *buf, U16 buflen, U32 *pcgi) — вызывается всегда.
Файлы в проекте, кроме майна и стартовых .C и .S:
C:\\Keil\\ARM\\RV31\\LIB\\TCP_CM3.lib
C:\\Keil\\ARM\\RV31\\LIB\\TCPD_CM3.lib
C:\\Keil\\ARM\\RL\\TCPnet\\Drivers\\EMAC_LPC17xx.c
C:\\Keil\\ARM\RL\\TCPnet\\Drivers\EMAC_LPC17xx.h
C:\\Keil\\ARM\\RL\\TCPnet\\SRC\\Net_Config.c
C:\\Keil\\ARM\\RL\\TCPnet\\SRC\\Net_Debug.c
C:\\Keil\\ARM\\RL\\TCPnet\\SRC\\Net_Config.h
0
Вы начните с начала, с пинга :) А о него до собственного web-сервера буквально один шаг.
0
Спасибо! Проект удалось собрать…
При прошивке пишет, что application running, но после выдаёт ошибку:
***JLink Error: Bad JTAG communication: Write to IR: Expected 0x1, got 0x0 (TAP Command: 10) @ Off 0xCB.
это опасно?)
Собирал проект пинг, светодиоды моргают, но не пингуется, галочку в Run in privileged mode поставил. Что может быть не так?
0
DHCP отключите в Net_Config.c
0
Спасибо за совет! Отключил DHCP и действительно ethernet порт на девайсе перестал постоянно моргать :)
Но все равно не пингуется :(
Если не трудно может посмотрите, пожалуйста..?
Файл прикреплен сюда:
Скачать
0
Что за плата? Какой чип обеспечивает физическое подключение к сети?
0
Плата: SK-MLPC1768
Чип: ks8721bl
0
У вас часом файрволы никакие не включены? Подсеть настроена?192.168.Х.у
0
Запускаю идущий в комплекте пример EasyWeb (там без RTOS, но и без управления МК) и наблюдаю в браузере и пингую его нормально.
Подсеть настроена так:
192.168.1.100 — у МК
192.168.1.33 — у ПК
0
У Вас starterkit-овская плата. Там чип другой. Кейл-овские драйвера его не знаю. Сеть без переделки EMAC_LPC17xx.c работать не будет.
0
Я приатачил архив с исправленными драйверами.
0
слыш ну шо там никто ничо не приходил за скс?
0
Опа,..Самозарядный Карабин Симонова… пойду отсюда.
0
Спасибо Вам ОГРОМНЮЧЕЕ!!! Все заработало, Вы спасли пару жизней :)
0
:)
0
Собрал такой сервер. Все работает, страницу генерирует. Но почему то маленькая скорость передачи (всего 5 кБ/сек). Вы не знаете почему так может быть?
0
По уарту какой нить обмен осуществляется?
0
Ну и пропингуйте сервак
ping 192.168.0.1 -t

посмотрите, как время пинга меняется. Не случаются ли периодические затыки на пару тысяч миллисекунд.
0
uart не используется. Затыки — да случаются.
0
У меня были затыки изза низкой скорости уарта. Камню нужно было больше времени для отправки строка, а в момент отправки HTTP-сервак тормозил. Может у вас другое железо периодически отвлекает камень?
0
У себя решил проблему поменяв скорость уарта с 9600 на 115200.
0
Не разумнее ли было решить проблему, выкинув тупые циклы ожидания? Т.е. кормить UART из DMA либо работать по прерываниям.
0
В общем проблема была в двух вещах: во-первых SPI был настроен на самую низкую скорость, во-вторых функция timer_tick () вызывалась реже чем следовало бы. Когда все поменял стало летать на скорости 300 кБ/с с лишним. Страничка со скриптами и css общей тяжестью 1 мегабайт с флешки загружается около 3 секунд. Спасибо за помощь и за блог ))
0
Кстати так и не пойму позволяет ли RLовский скриптовый язык генерить динамические страницы, в которых можно варьировать размер передаваемых данных? Например таблица со списком подключенных модулей (их может быть 2, может 30)?
0
Вы не знаете как в RL-ARM изменить страницы ошибок? Я, как написано в мануле добавил модуль HTTP_ERR.C, теперь он жалуется на множественное определение перменных:
Error: L6200E: Symbol http_err_401 multiply defined (by http_err.o and http_err.o).
Error: L6200E: Symbol http_err_404 multiply defined (by http_err.o and http_err.o).
Error: L6200E: Symbol http_err_501 multiply defined (by http_err.o and http_err.o).
Error: L6200E: Symbol http_err_head multiply defined (by http_err.o and http_err.o).
Error: L6200E: Symbol http_err_foot multiply defined (by http_err.o and http_err.o).
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.