• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Прием данных по UART

Это то .
В файле я дописал пару строк и создал массив . А в главном файле я этот массив обрабатываю . Если данные появились , то значит по юарт пришло что то.
Файл прикрепляю: Screenshot_2017-08-25-10-44-46-183_com.google.android.apps.docs.png
в uart.c дописал строки?
 
upd:
открыл файл. нормально так.
по сути у тебя свой командный инрепретатор на If'ах тоже хорошо.
Я его с avr перенес в есп когда 2 дня не получалось принять данные.
Я на авр всегда так использовал , работает четко . И на есп практика показала что работает четко .
 
@Артемий хорошая работа! сейчас попробую скопипастить к себе. что нужно
в blinky.c мне надо добавить
char string_search(char *str1,char *str2)
void AT_cmd()
(что ещё?)
а в uart.c
uart0_rx_intr_handler(void *para) твоей версии
uart_config(uint8 uart_no) взять у тебя
и
uart1_tx_one_char(uint8 TxChar) тоже взять у тебя.

что-то ещё надо?
плюс я вывожу инфорация стандатным для SDK os_printf() на uart0
это допустимо с твоом кодом?
 
@Артемий хорошая работа! сейчас попробую скопипастить к себе. что нужно
в blinky.c мне надо добавить
char string_search(char *str1,char *str2)
void AT_cmd()
(что ещё?)
а в uart.c
uart0_rx_intr_handler(void *para) твоей версии
uart_config(uint8 uart_no) взять у тебя
и
uart1_tx_one_char(uint8 TxChar) тоже взять у тебя.

что-то ещё надо?
плюс я вывожу инфорация стандатным для SDK os_printf() на uart0
это допустимо с твоом кодом?
Спасибо :)
"uart1_tx_one_char" - этого вроде не надо.
Возьми свой файл uart.c переименуй на время . А мой подставь .
А в главном файле добавь функции и т.д.

string_search() - хитрая функция , сам когда то ее написал . Она может в большом массиве найти совпадение строк по словам . Не обязательно чтобы это слово было в начале . Оно может быть и в середине .
Это я делал для работы с есп в режиме ат команд , чтобы другой мк мог взаимодействовать нормально с есп. А то в есп дурнуватые ат команды , которые трудно обрабатывать .
 
"uart1_tx_one_char" - этого вроде не надо.
Возьми свой файл uart.c переименуй на время . А мой подставь .
А в главном файле добавь функции и т.д.
коль так то я могу просто тупо взять твой))
в главно какие строки отвечают за прописку прерываний?
 
коль так то я могу просто тупо взять твой))
в главно какие строки отвечают за прописку прерываний?
Прием строк на прерываниях работает . В файле uart.c как раз объявлено это прерывание . uart.c должны быть по идее одинаковы , и можно просто заменить файл моим. Но лучше сохранить и оригинальный на всяк случай.
 
Прием строк на прерываниях работает . В файле uart.c как раз объявлено это прерывание . uart.c должны быть по идее одинаковы , и можно просто заменить файл моим. Но лучше сохранить и оригинальный на всяк случай.
что я и сделал.
можешь сказать что написано тут:

// ��������� ���� � ������
cmdBuffer [ cmdBufferWriteIdx ++ ] = RcvChar;
// ��������������
 
что я и сделал.
можешь сказать что написано тут:

// ��������� ���� � ������
cmdBuffer [ cmdBufferWriteIdx ++ ] = RcvChar;
// ��������������
Записывается прилетевший символ в буфер и нарастает счетчик , для записи следующего символа уже в новую ячейку .
 
странно
ругается

Код:
$ make
xtensa-lx106-elf-gcc -I/d/Teko_projects/sechub_esp_modem -I/home/sam/esp-open-sdk/sdk/driver_lib/include/driver -I/home/sam/esp-open-sdk/sdk/include -mlongcalls -Os -ffunction-sections -fdata-sections -DICACHE_FLASH   -c -o blinky.o blinky.c
blinky.c: In function 'AT_cmd':
blinky.c:51:32: error: 'cmdBuffer' undeclared (first use in this function)
     if(string_search("AT+REV?",cmdBuffer))
                                ^
blinky.c:51:32: note: each undeclared identifier is reported only once for each function it appears in
blinky.c:67:25: error: 'ssid_str' undeclared (first use in this function)
      for(x=11; x<y; x++)ssid_str[x-11] = cmdBuffer[x];
                         ^
blinky.c: At top level:
blinky.c:136:6: error: conflicting types for 'string_search'
char string_search(char *str1,char *str2)
      ^
blinky.c:51:8: note: previous implicit declaration of 'string_search' was here
     if(string_search("AT+REV?",cmdBuffer))
        ^
<встроенное>: ошибка выполнения рецепта для цели «blinky.o»

в каких хидерах должна быть прописаны функции?
разобрался с переменными - взял у тебя
а со стринг_сеарчем - я его функцию вставил выше приёмника АТ команд.

теперь - где мне выполнить void AT_cmd()? чтобы он выполнил мою строку?
 
Последнее редактирование:
@Артемий
вот что у меня в итоге получилось. пока не запускал.
Код:
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
#include "key.h"
#include "c_types.h"
#include "time.h"
#include "mem.h"
#include "uart.h"


#define user_procTaskPrio        0
#define user_procTaskQueueLen    1
os_event_t    user_procTaskQueue[user_procTaskQueueLen];
// static void loop(os_event_t *events);
LOCAL os_timer_t network_timer;

static volatile os_timer_t some_timer;


extern char cmdBuffer[];

char ssid_str[32] = "CO2";
char pass_str[64] = "co2passwd";
char id_send0_str[8] = "012EF412";
char id_send1_str[8] = "012EF419";

// static void ICACHE_FLASH_ATTR loop(os_event_t *events)
// {
//   int c = uart0_rx_one_char();
//   if(c == 0x30)
//   {
//    uart0_tx_buffer("0123456789", 10);
//   }
//   if(c == 0x31)
//   {
//    uart0_tx_buffer("9876543210", 10);
//   }
//   system_os_post(user_procTaskPrio, 0, 0 );
// }

void some_timerfunc(void *arg)
{
  //debag i am alive
  os_printf("On working! \r\n");
}


char string_search(char *str1,char *str2)
{
  unsigned int addr=0,x=0,y=0;
  str1+=0;
  str2+=0;

  while(str1[addr]!=0)
  {
    addr++;
  }

  while(str1[y]!=0 && str2[x]!=0)
  {
    if(str1[y] == str2[x])
  {
    y++;
    x++;
  }
  else
  {
    if(y<addr)y=0;
    x++;  // ��������� ���������� ������� ������� ������
  }
  //printf("Y=%d,X=%d,ADDR=%d, str1=%c , str2=%c \r\n" , y,x,addr,str1[y] , str2[x]);
}

//printf("Y=%d,X=%d,ADDR=%d\r\n" , y,x,addr);

if(y && (addr==y))return x; // ��������� ���! ���������� ��������� ����� ��������� ������
return 0;
}
void AT_cmd()
{
    static char buff_at[64], x=0, timer_at=0;
    static char y=0;
////////////////////////
if(string_search("AT+REV?",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("REV1.0 , Autor: Ugrimov A.O. ,\r\nOK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+AP_NSET=",cmdBuffer))
{

    x=0;
    while(cmdBuffer[x++]!=0)
    {
         y++;
    }

    for(x=11; x<y; x++)ssid_str[x-11] = cmdBuffer[x];
    //os_memcpy(wifiApConf.ssid, &buff_at, sizeof (buff_at));

    data_write();
y=0;
    data_read();
#ifdef PLATFORM_DEBUG
     ets_uart_printf("wifiApConf=%s \r\n", ssidAp.ssid);
     ets_uart_printf("%s \r\n", ssid_str);
     ets_uart_printf("NSET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+AP_NSET?",cmdBuffer))
{
    data_read();
#ifdef PLATFORM_DEBUG
    ets_uart_printf("result ssid: %s\n", ssidAp);
#endif
    clear_buf();
}
else if(string_search("AT+AP_PSET=",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("PSET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+ID0_SET=",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("ID0_SET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+ID1_SET=",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("ID1_SET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+SDK_VER?",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
    ets_uart_printf("SDK version:%s\n OK\r\n", system_get_sdk_version());
#endif
    clear_buf();
}
else if(cmdBuffer[0]!=0)// ������� �� �������
{
  if(++timer_at>10)
  {
     #ifdef PLATFORM_DEBUG
     ets_uart_printf("ERR_CMD!\r\n");
     clear_buf();
     #endif
     timer_at=0;
  }

}
else if(cmdBuffer[0]==0)
{
      timer_at=0;
}
}


void ICACHE_FLASH_ATTR user_init()
{
  // init gpio subsytem
  gpio_init();

  //uart_init
  uart_init(74400, 74400);
  os_printf("\r\n ESP8266 started!\r\n");
  wifi_set_opmode(0x00);
  os_printf("\r\n Wi-Fi off!\r\n");

  // setup timer (500ms, repeating)
  os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
  os_timer_arm(&some_timer, 1000, 1);

  // system_os_task(loop, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen);
  // system_os_post(user_procTaskPrio, 0, 0 );


}
мне куда void AT_cmd() сунуть чтобы строка проверялась?
 
@Артемий
вот что у меня в итоге получилось. пока не запускал.
Код:
#include "ets_sys.h"
#include "osapi.h"
#include "gpio.h"
#include "os_type.h"
#include "user_interface.h"
#include "espconn.h"
#include "key.h"
#include "c_types.h"
#include "time.h"
#include "mem.h"
#include "uart.h"


#define user_procTaskPrio        0
#define user_procTaskQueueLen    1
os_event_t    user_procTaskQueue[user_procTaskQueueLen];
// static void loop(os_event_t *events);
LOCAL os_timer_t network_timer;

static volatile os_timer_t some_timer;


extern char cmdBuffer[];

char ssid_str[32] = "CO2";
char pass_str[64] = "co2passwd";
char id_send0_str[8] = "012EF412";
char id_send1_str[8] = "012EF419";

// static void ICACHE_FLASH_ATTR loop(os_event_t *events)
// {
//   int c = uart0_rx_one_char();
//   if(c == 0x30)
//   {
//    uart0_tx_buffer("0123456789", 10);
//   }
//   if(c == 0x31)
//   {
//    uart0_tx_buffer("9876543210", 10);
//   }
//   system_os_post(user_procTaskPrio, 0, 0 );
// }

void some_timerfunc(void *arg)
{
  //debag i am alive
  os_printf("On working! \r\n");
}


char string_search(char *str1,char *str2)
{
  unsigned int addr=0,x=0,y=0;
  str1+=0;
  str2+=0;

  while(str1[addr]!=0)
  {
    addr++;
  }

  while(str1[y]!=0 && str2[x]!=0)
  {
    if(str1[y] == str2[x])
  {
    y++;
    x++;
  }
  else
  {
    if(y<addr)y=0;
    x++;  // ��������� ���������� ������� ������� ������
  }
  //printf("Y=%d,X=%d,ADDR=%d, str1=%c , str2=%c \r\n" , y,x,addr,str1[y] , str2[x]);
}

//printf("Y=%d,X=%d,ADDR=%d\r\n" , y,x,addr);

if(y && (addr==y))return x; // ��������� ���! ���������� ��������� ����� ��������� ������
return 0;
}
void AT_cmd()
{
    static char buff_at[64], x=0, timer_at=0;
    static char y=0;
////////////////////////
if(string_search("AT+REV?",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("REV1.0 , Autor: Ugrimov A.O. ,\r\nOK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+AP_NSET=",cmdBuffer))
{

    x=0;
    while(cmdBuffer[x++]!=0)
    {
         y++;
    }

    for(x=11; x<y; x++)ssid_str[x-11] = cmdBuffer[x];
    //os_memcpy(wifiApConf.ssid, &buff_at, sizeof (buff_at));

    data_write();
y=0;
    data_read();
#ifdef PLATFORM_DEBUG
     ets_uart_printf("wifiApConf=%s \r\n", ssidAp.ssid);
     ets_uart_printf("%s \r\n", ssid_str);
     ets_uart_printf("NSET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+AP_NSET?",cmdBuffer))
{
    data_read();
#ifdef PLATFORM_DEBUG
    ets_uart_printf("result ssid: %s\n", ssidAp);
#endif
    clear_buf();
}
else if(string_search("AT+AP_PSET=",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("PSET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+ID0_SET=",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("ID0_SET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+ID1_SET=",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
     ets_uart_printf("ID1_SET OK\r\n");
     clear_buf();
#endif
}
else if(string_search("AT+SDK_VER?",cmdBuffer))
{
#ifdef PLATFORM_DEBUG
    ets_uart_printf("SDK version:%s\n OK\r\n", system_get_sdk_version());
#endif
    clear_buf();
}
else if(cmdBuffer[0]!=0)// ������� �� �������
{
  if(++timer_at>10)
  {
     #ifdef PLATFORM_DEBUG
     ets_uart_printf("ERR_CMD!\r\n");
     clear_buf();
     #endif
     timer_at=0;
  }

}
else if(cmdBuffer[0]==0)
{
      timer_at=0;
}
}


void ICACHE_FLASH_ATTR user_init()
{
  // init gpio subsytem
  gpio_init();

  //uart_init
  uart_init(74400, 74400);
  os_printf("\r\n ESP8266 started!\r\n");
  wifi_set_opmode(0x00);
  os_printf("\r\n Wi-Fi off!\r\n");

  // setup timer (500ms, repeating)
  os_timer_setfn(&some_timer, (os_timer_func_t *)some_timerfunc, NULL);
  os_timer_arm(&some_timer, 1000, 1);

  // system_os_task(loop, user_procTaskPrio, user_procTaskQueue, user_procTaskQueueLen);
  // system_os_post(user_procTaskPrio, 0, 0 );


}
мне куда void AT_cmd() сунуть чтобы строка проверялась?
В mail.c !
 
сделал так:

void some_timerfunc(void *arg)
{
//debag i am alive
os_printf("On working! \r\n");
AT_cmd();
}
и увидел что байты у меня принимаются и эхом отвечаются. уже хорошо! но теперь надо получить заранее спрограммированный ответ.
 
Сверху Снизу