roboforum.ru

Технический форум по робототехнике.

Прошу помощи! (помогите с написанием программы на Си Code..)

Прошу помощи! (помогите с написанием программы на Си Code..)

slava » 30 май 2005, 13:29

Вообщем беда - не могу написать программу на Си. (CodeVision)

Я научился мигать светодиодами, управлять таймерами, писать на LCD, отправлять символы по последовательному порту.

А теперь вот в ступоре! Прошу помощи.

Мне нужно что бы я мог послать команду по последовательному порту (от PC в МК) вида "stop" , "left motor on", "left motor off", "led on", "led off" и т.п.
Процедуры обработки напишу сам, а вот как принимать команды и вызывать соответствующие процедуры - ну не получается! И еще хочется что б данная обработка работала по прерыванию от UARTа (что б не сновном цикле крутилась)

Помогите плз.

Tracer » 30 май 2005, 14:11

Ну а вчем собственно у тебя проблема

Если ты умееш принимать(передавать) символы по RS232 то ты можеш и писать их в строку. А затем используя стандартные функции (см. string.h)находить подстроку в строке и по результату выполнять нужную ветку алгоритма

Разбор команд стандартная процедура в программах для простоты их можно и упростить Left motor ON -> LMON например

slava » 30 май 2005, 17:42

Понимаю, что туплю :(

Но если кусок кода скинете, то буду должен пиво :)

nest » 30 май 2005, 17:57

в принципе ... примерно так:

отсылаешь , скажим , "1" - загорается лампочка... "2" - крутится мотор ... и в таком духе дальше ...
просто будет завязка "символ<->команда" (это то ты сможешь ?)

если хочешь отправлять текстовые комманды - придётся позаботиться о разграничителях пакетов ... типа: %stop& , %motor_on&
(т.е. "%" - начало пакета, "&" - конец пакета ...)

slava » 31 май 2005, 11:29

nest писал(а):в принципе ... примерно так:

отсылаешь , скажим , "1" - загорается лампочка... "2" - крутится мотор ... и в таком духе дальше ...
просто будет завязка "символ<->команда" (это то ты сможешь ?)


типа

k=getchar();
if (k=="1") { зажгли лампочку}

и т.д.

это неинтересно, ибо будем постоянно ждать введенные символы ..


если хочешь отправлять текстовые комманды - придётся позаботиться о разграничителях пакетов ... типа: %stop& , %motor_on&
(т.е. "%" - начало пакета, "&" - конец пакета ...)


вроде этого, но использовать rx_buffer - а тут и туплю :(

Tracer » 31 май 2005, 11:53

Зачем ждать Ты же размещаеш код в функции прерывания по приему символа

switch(UDR)
      {
      case {код символа}: {зажигаем лампочку};break;
      case {код символа}: {Left motor ON};break;
      .....
      default: break;
      }

slava » 31 май 2005, 13:13

Tracer писал(а):Зачем ждать Ты же размещаеш код в функции прерывания по приему символа

switch(UDR)
      {
      case {код символа}: {зажигаем лампочку};break;
      case {код символа}: {Left motor ON};break;
      .....
      default: break;
      }


Это я понял, а как сделать если я хочу текстовые команды использовать  ? и еще с параметрами ?

Tracer » 31 май 2005, 14:04

Без разбора строки на подстроку никуда не деться
Прийдется делать нечто такое

#include <string.h>
#define ON 1
#define OFF 0
...

   if(strstr(uartbuffer,"Light") != NULL)
     {
        if(strstr(uartbuffer,"ON") != NULL) light(ON);
        if(strstr(uartbuffer,"OFF) != NULL) light(OFF);
      }
if(strstr(uartbuffer,"Motor") != NULL)
     {
        if(strstr(uartbuffer,"ON") != NULL) motor(ON);
        if(strstr(uartbuffer,"OFF) != NULL) motor(OFF);
      }

slava » 31 май 2005, 14:36

т.е. в обработчике прерывания ловим идентификатор конца команды, далее из буфера в строку - и ее уже обратываем, так ?

Tracer » 31 май 2005, 15:08

Именно ТАК

FSnow » 01 июн 2005, 13:31

... если я хочу текстовые команды использовать? и еще с параметрами ?

я думаю будет оригинально использовать вместо команд
четверостишья допустим А.С.Пушкина, что-то вроде этого:
Команда 1:
"Идет на право - песнь заводит"  означает
Поворот на право с включением сирены
Команда 2:
"Выпьем няня, где же кружка <Параметр>"  -
Робот галопом несется на кухню за пивом  
<Параметр> количество банок пива.  :lol:
А если серьезно, ИМХО, текстовые команды - явный пербор.
Пакета длиной байта 3 + CRC должно хватить.
Пусть
  $01 -  Команда позиционирование сервопривода
  <п1>- id сервопривода
  <п2>- позиция
Пример  01 04 83 (CRC)
Ну и дальше начинаешь обрабатывать ...

slava » 01 июн 2005, 18:36

FSnow писал(а):
... если я хочу текстовые команды использовать? и еще с параметрами ?

я думаю будет оригинально использовать вместо команд
четверостишья допустим А.С.Пушкина, что-то вроде этого:
Команда 1:
"Идет на право - песнь заводит"  означает
Поворот на право с включением сирены
Команда 2:
"Выпьем няня, где же кружка <Параметр>"  -
Робот галопом несется на кухню за пивом  
<Параметр> количество банок пива.  :lol:
А если серьезно, ИМХО, текстовые команды - явный пербор.
Пакета длиной байта 3 + CRC должно хватить.
Пусть
  $01 -  Команда позиционирование сервопривода
  <п1>- id сервопривода
  <п2>- позиция
Пример  01 04 83 (CRC)
Ну и дальше начинаешь обрабатывать ...



Текстовые команды возможно и перебор - но:

1. Наглядно
2. Для повторения боллее чем удобно

Tracer » 01 июн 2005, 19:13

Исключительно для удобства НАЧИНАЮЩИХ и при наличии избыточного МК текстовые команды - ПРАВИЛЬНО
Но красивее в КЛАССИЧЕСКОМ смысле всетаки числовое представление

КАК промежуточное решение

Интерфейсная программа  на ПК преобразует ТЕКСТОВЫЕ команды в числовые и передает их в МК по  СОМ порту

Ну а вообще РАЗРАБОТЧИК всегда ПРАВ (ИМНО) :D

slava » 01 июн 2005, 19:19

Tracer писал(а):Исключительно для удобства НАЧИНАЮЩИХ и при наличии избыточного МК текстовые команды - ПРАВИЛЬНО
Но красивее в КЛАССИЧЕСКОМ смысле всетаки числовое представление

КАК промежуточное решение

Интерфейсная программа  на ПК преобразует ТЕКСТОВЫЕ команды в числовые и передает их в МК по  СОМ порту

Ну а вообще РАЗРАБОТЧИК всегда ПРАВ (ИМНО) :D


Хм, может я и заблуждаюсь, но:

Все свои разработки по теме роботов, я буду делать открытыми!, и поэтому, для помощи начинающим-повторяющим текстовые команды будут проще для освоения. опять таки ИМХО :)

FSnow » 02 июн 2005, 09:06

Ну а вообще РАЗРАБОТЧИК всегда ПРАВ (ИМНО)

возможно, возможно...  :wink:

2Slava
Кстати, Вы прикинули планируемое количество команд?

для помощи начинающим-повторяющим текстовые команды будут проще для освоения

Спорно. Мне кажется, если начинающий разобрался
с МК, то таблица из 15 (допустим) команд его наврядли напрягет.

КАК промежуточное решение
Интерфейсная программа  на ПК преобразует ТЕКСТОВЫЕ команды в числовые и передает их в МК по  СОМ порту

смущает только фраза "промежуточное решение".
ИМХО, это нормальное решение.

и еще пытаюсь представить ситуацию (возможно я ее не так вижу).
Решил начинающий повторить Ваш проект
(кстати я с интересом за ним слежу, делаю что-то подобное,
чуть по проще, и планирую идти по Вашим стопам  :wink: )
Далее начинающий собрал плату. Прошил контроллер.
Запустил интерфейсную прогу на ПК. Работает (повезло ему).
Потом начал разбираться с кодом (для общего развития).
читает:
switch(UDR) {
     // Код $01 - Зажигаем лампу №1 (к примеру)
     case {код символа}: {зажигаем лампочку};break;
     .....

неужели это менее понятно и наглядно, чем  
  // Light - Зажигаем лампу №1
 if(strstr(uartbuffer,"Light") != NULL)
    {
       if(strstr(uartbuffer,"ON") != NULL) light(ON);
       if(strstr(uartbuffer,"OFF) != NULL) light(OFF);
     }


К слову, операции со строками, само собой будут выполнятся
медленнее, хотя я понял что на это забили.
И еще обязательно прийдется выковыривать слова из строки
если работать с параметрами, преобразовывать  их в числа и т.п.

Все выше сказанное - всего лишь мое мнение.
Ничего личного  :lol:


Rambler\'s Top100 Mail.ru counter