roboforum.ru

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

Терминал Help !!

В этом разделе обсуждаются вопросы по использованию ПК и КПК в робототехнике.
Программирование, настройка, аппаратная часть.

Re: Терминал Help !!

Сообщение =DeaD= » 08 ноя 2011, 11:34

Хм, у меня не разу не было, через что обмен - USB-UART?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Терминал Help !!

Сообщение Korbofos » 08 ноя 2011, 12:12

ДА!
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Терминал Help !!

Сообщение Flexz » 08 ноя 2011, 14:04

Наверное просто "выпадает" один символ, ну а дальше последствия - смотря как чтение реализовано. Может выглядеть как будто передаются данные не с первого, а со второго байта, или наоборот один байт проглатывается.
Flexz
 
Сообщения: 47
Зарегистрирован: 27 авг 2011, 14:05

Re: Терминал Help !!

Сообщение galex1981 » 08 ноя 2011, 14:07

"Выпадения" символов проверяются понижением скорости обмена по Уарту...
if(!Operate) Read(pDatasheet);
Аватара пользователя
galex1981
 
Сообщения: 4360
Зарегистрирован: 04 дек 2008, 22:44
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович

Re: Терминал Help !!

Сообщение Flexz » 08 ноя 2011, 14:26

Это смотря в чем причина, если проц не успевает отправлять, то да. А если потери идут между передатчиком и приемником, то никаких гарантий, что станет лучше, может просто реже станет проявляться.
Для надежной передачи нужно мутить полноценный протокол, с контрольными суммами и повторами. Ну или как минимум реализовать адекватное восстановление после сбоя, например, начинать передачу неким контрольным символом, который не встречается в остальном сообщении (byte-stuffing).
Flexz
 
Сообщения: 47
Зарегистрирован: 27 авг 2011, 14:05

Re: Терминал Help !!

Сообщение Korbofos » 08 ноя 2011, 14:27

В мк в прерывании пихаю перешедший байт в буфер
Код: Выделить всёРазвернуть
interrupt [USART1_RXC] void usart1_rx_isr(void)
{
rx_buffer[rx_wr_index++]=UDR1;
  if (rx_wr_index == RX_BUFFER_SIZE){rx_wr_index=0;}
  if (++rx_counter == RX_BUFFER_SIZE)
  {
  rx_counter=0;
  }
}


unsigned char rx_read (void)
{
unsigned char data;
while(rx_counter==0);
data=rx_buffer[rx_rd_index++];
if (rx_rd_index == RX_BUFFER_SIZE) {rx_rd_index=0;}
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}

void main (void){
while (1)
{
  switch (rx_read())
   {
   case SYNCHRONIZATION:       //0
   rx_counter=0;
   break;

   case RADAR:                     //1
   radar(rx_read());
   break;

   case SENSOR:                    //2
   tx_write(SENSOR);
   tx_write(sensor());
   break;

   case ROBOMD2:                   //3
   robomd2(rx_read(),rx_read());
   tx_write(ROBOMD2);
   break;

   case SERVO:                      //4
   servo(rx_read(),rx_read());
   tx_write(SERVO);
   break;

   case ADC_FUNCT:                   //5
   start_adc(rx_read());
   tx_write(ADC_FUNCT);
   tx_write(read_adc());
   break;

   default:
   tx_write(0);
   tx_write(0);             //
   tx_write(0);
   }
}} 


Потом по кейсам смотрю что надо делать дальше.
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Терминал Help !!

Сообщение Flexz » 08 ноя 2011, 14:55

Ну тут все вроде бы симпатично. Прием на стороне ПК сделан аналогично? Синхронизацию делаете между каждой парой команд?
Flexz
 
Сообщения: 47
Зарегистрирован: 27 авг 2011, 14:05

Re: Терминал Help !!

Сообщение Korbofos » 08 ноя 2011, 15:17

Синхронизация срабатывает если мк или терминал не поняли друг друга
В потоке чтение и запись в порт!
Код: Выделить всёРазвернуть
DWORD WINAPI MyroboThread(LPVOID)
{
unsigned char ask;
unsigned char funct, param1, param2;
while(1)
{
  switch (next_funct) //функции отправки данных на мк
  {
  case 1:
  sharp_redi=0;
  radar_write();
  break;
  case 2:
  calc();
  break;
  case 3:
  speed();
  break;
  }
  if(read_byte) //если надо что принять
  {
   switch (read_rx()) //функции чтения данных с мк
   {
   case 1:
   param1=read_rx();
   param2=read_rx();
   radar_read(param1,param2);
   break;
   case 2:
   break;
   case 3:
   break;
   case 4:
   break;
   default:
   ShowMessage("Error read");
   break;
   }
  }
}

}

unsigned char  read_rx (void)
{
unsigned char data;
while(rx_counter==0){};
data=bufrd[rx_index++];
--rx_counter;
if (rx_counter==0)
{
rx_index=0;
memset(bufrd, 0, BUFSIZE);
}
return data;
}

void write_tx (unsigned char data)
{
bufwr[tx_index++]=data;
++tx_counter;
}
DWORD WINAPI ReadThread(LPVOID)
{
COMSTAT comstat;      //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов
DWORD btr, temp, mask, signal;   //переменная temp используется в качестве заглушки

overlapped.hEvent = CreateEvent(NULL, true, true, NULL);   //создать сигнальный объект-событие для асинхронных операций
SetCommMask(COMport, EV_RXCHAR);                              //установить маску на срабатывание по событию приёма байта в порт
while(1)                  //пока поток не будет прерван, выполняем цикл
  {
   WaitCommEvent(COMport, &mask, &overlapped);                  //ожидать события приёма байта (это и есть перекрываемая операция)
   signal = WaitForSingleObject(overlapped.hEvent, INFINITE);   //приостановить поток до прихода байта
   if(signal == WAIT_OBJECT_0)                    //если событие прихода байта произошло
    {
     if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent
      if((mask & EV_RXCHAR)!=0)               //если произошло именно событие прихода байта
       {
        ClearCommError(COMport, &temp, &comstat);      //нужно заполнить структуру COMSTAT
        btr = comstat.cbInQue;                             //и получить из неё количество принятых байтов
        if(btr)                                  //если действительно есть байты для чтения
        {
         ReadFile(COMport, bufrd, btr, &temp, &overlapped);     
         rx_counter+=btr;                                         
                                     
        }
       }
    }
  }
}
DWORD WINAPI WriteThread(LPVOID)
{
DWORD temp, signal;   //temp - переменная-заглушка

overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);       

while(1)
  {
   WriteFile(COMport, bufwr, tx_counter, &temp, &overlappedwr);   
   signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);    
     tx_counter=0;
     tx_index=0;
   if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(COMport, &overlappedwr, &temp, true)))   
     {
      Form1->StatusBar1->Panels->Items[0]->Text  = "Transmission was successful";   
     }
   else {Form1->StatusBar1->Panels->Items[0]->Text  = "Error transmit";}    
     SuspendThread(writer);
     }
}

РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Терминал Help !!

Сообщение Flexz » 08 ноя 2011, 21:00

В этот код уже сильно не вникал, перемудрено как-то. Зачем 3 потока? Тут и один прекрасно справился бы, протокол-то полудуплексный (т.е. "запрос-ответ"). А переданные в ПК данные никуда не денутся, буферизация уже реализована на более низком уровне и делать поверх нее еще и свою незачем, в отличие от контроллера.
Flexz
 
Сообщения: 47
Зарегистрирован: 27 авг 2011, 14:05

Re: Терминал Help !!

Сообщение Korbofos » 11 ноя 2011, 09:53

Переписал синхронизацию стало работать нормально! Примерно раз минут в 10 требуется синхронизация...
Сделал корявую визуализацию радара.
А вот чтобы не ждать ответа от мк, сделать не получается.
Вложения
Безымянный.JPG
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Терминал Help !!

Сообщение Korbofos » 07 дек 2011, 12:40

Подскажите монитор com порта под win7? До этого юзал под ХР - hdd serial port monitor 3.31, но он к сожелению не работает под семёркой. Нормального нечего найти не могу.
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Терминал Help !!

Сообщение Korbofos » 18 мар 2012, 21:28

Код: Выделить всёРазвернуть
char ribbon_segment[8];
char *ribbon = "   N   NE   E   SE   S   SW   W   NW   N   ";
azimuth= get_heading(&a_avg, &m_avg, &p);
strncpy(ribbon_segment, &ribbon[(azimuth + 5) / 10], 8);
Form1->StatusBar1->SimpleText=ribbon_segment+IntToStr(azimuth);

Подскажите как этот кусок переделать в С++, а то так какие то артефакты выдаёт.
Попробовал вот так переделать
Код: Выделить всёРазвернуть
string st1 = ("   N   NE   E   SE   S   SW   W   NW   N   "); 
string st2;
azimuth= get_heading(&a_avg, &m_avg, &p);
size_t x=(azimuth + 5) / 10; //здесь 2 ошибки
st1.copy(st2,x,8);
Form1->StatusBar1->SimpleText=st2; //здесь требует AnsiString
РАБОТА, РАБОТА перейди на Федота, с Федота на его брата, а ко мне их зарплата.
Аватара пользователя
Korbofos
 
Сообщения: 317
Зарегистрирован: 15 янв 2011, 11:27
Откуда: Челябинск
прог. языки: C/C++
ФИО: Александр

Re: Терминал Help !!

Сообщение Vupver » 24 мар 2012, 23:35

Привет всем!
Задумал сделать управление несколькими реле по схеме: COM-port <-> МК (PIC16F876) -> реле.
В Протеусе через Virtual Terminal схема работает корректно, так что думаю при сборе железа агрегат должен исправно работать через стандартный HyperTerminal.
Проблема в следующем - есть желание написать программу для более приветливого интерфейса, но опыта программирования COM-портов нет.
Что необходимо реализовать в этой программе? думаю следующие настройки обязательны:
1) открытие самого порта по номеру;
2) установка скорости обмена,проверка чет\нечет, стоп бит;
3) ну и, например, кнопка для каждого реле, при нажатии которой на PIC посылается команда(сообщение) для включения\выключения соответствующего реле.

Какие еще функции обязательны для такой программы?
Аватара пользователя
Vupver
 
Сообщения: 8
Зарегистрирован: 22 мар 2010, 10:03
Откуда: Тверь

Re: Терминал Help !!

Сообщение elmot » 25 мар 2012, 00:15

Есть предложение не писать велосипедов
http://realterm.sourceforge.net/index.h ... Parameters
http://www.chiark.greenend.org.uk/~sgtatham/putty/
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Терминал Help !!

Сообщение Vupver » 27 мар 2012, 21:45

elmot , благодарю за ответ, но "написание велосипеда" поможет мне разобраться с принципами программирования порта, что будет полезно и для других проектов.
Аватара пользователя
Vupver
 
Сообщения: 8
Зарегистрирован: 22 мар 2010, 10:03
Откуда: Тверь

Пред.След.

Вернуться в Компьютеры в роботостроении

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1