C++ клавиши

C++ клавиши

Сообщение illusive » 23 фев 2013, 16:49

Требуется отсылать в COM порт данные, пока нажата определенная клавиша.

Код: Выделить всё
cvNamedWindow("window", 1);
for(;;)
{
  if(cvWaitKey(0)==38) //стрелка вверх
 {
   //передача данных
  cout << "keypressed"; //test message
 }
 if(cvWaitKey(0)==27)
 {
  break;
 }
}


Есть ли более правильное решение? И как лучше передавать данные: используя qextserialport, или работая как с обычным файлом? (Qt, mingw)
illusive
 
Сообщения: 20
Зарегистрирован: 23 фев 2013, 16:28

Re: C++ клавиши

Сообщение noonv » 23 фев 2013, 20:53

Код: Выделить всё
cvWaitKey(0);
будет ждать нажатия клавиши, поэтому если вы не хотите "вешать" программу, лучше задать какой-нибудь параметр типа
Код: Выделить всё
cvWaitKey(33);

а можно по-старинке:
Код: Выделить всё
 while(1)
        {
                if (_kbhit())
                {
                        char key = _getch();
                        printf( "[i] Key: %c (%d)\n", key ,key );
                        if(key==27) //ESC
                                break;
...

illusive писал(а):как лучше передавать данные: используя qextserialport, или работая как с обычным файлом? (Qt, mingw)

как больше нравится :)
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: C++ клавиши

Сообщение illusive » 24 фев 2013, 09:02

Спасибо за ответ, но я забыл сказать, что при использовании подобных циклов с использованием kbhit() и getch() IDE и программа намертво зависают. Если использовать getch() без бесконечного цикла то получается странный результат. Может быть вы знаете в чем причина?

При запуске этого кода:

Код: Выделить всё
#include "iostream"
#include "conio.h"

using namespace std;

int main()
{
    for(int i=0; i<5; i++)
    {
     char key = _getch();
     cout << key << endl;
    }
}


Получается результат:

Код: Выделить всё
я
я
я
я
я


Хотя я ничего не нажимаю.
illusive
 
Сообщения: 20
Зарегистрирован: 23 фев 2013, 16:28

Re: C++ клавиши

Сообщение noonv » 24 фев 2013, 14:15

illusive писал(а):программа намертво зависают.

странно - я же привёл пример, где всё работет нормально ;)

возможно дело в нюансах реализации?
illusive писал(а):Если использовать getch() без бесконечного цикла то получается странный результат. Может быть вы знаете в чем причина?

int kbhit(void); - Проверяет наличие ввода с клавиатуры (нажатие клавиши).
int getch(); - читает без эхо-отображения отдельный символ прямо с консоли. Возвращаемого значения в случае ошибки нет.

только что проверил вашу программу - у меня под MSVS Express 2010 она срабатывает только на нажатие ;)
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: C++ клавиши

Сообщение illusive » 01 мар 2013, 18:36

Видимо это проблема связана с моей IDE, ну тогда буду пользоваться cvWaitKey(33) (кстати, почему во всех примерах именно 33?)
Вообще, пытаюсь собрать робота работающего в 2 режимах, пока начал с ручного управления.

Код: Выделить всё
while(i<1)
{
  switch(cvWaitKey(33))
  {
    case 119: TransmitCommand('w'); break; //w FORWARD
    case 97: TransmitCommand('l'); break; //a LEFT
    case 115: TransmitCommand('b'); break; //s BACK
    case 100: TransmitCommand('r'); break; //d RIGHT
    case 27: i=1; break; //esc
    default: TransmitCommand('s'); break; //STOP
  }
}


TransmitCommand(char) - записывает в COM порт символ с использованием WinAPI.

Скетч:
Код: Выделить всё
if (Serial.available())
{
  char inputCommand = Serial.read();
  switch(inputCommand)
  {
    case 'w': setW(); break; //Двигается вперед
    case 'b': setB(); break; //назад
    case 'l': setL(); break;
    case 'r': setR(); break;
    case 's': setS(); break; /останавливается
    default: break;
   }
}
...
void setW()
{
  if (nowStatus != 'w') //если не едет вперед
  {
    stopMove();
    moveForward();
    nowStatus='w'; //установить статус - движение вперед
  }
}

void setS()
{
  if (nowStatus != 's') //если движется
  {
    stopMove();  //остановить движение
    nowStatus='s'; //установить статус - движение остановлено
  }
}


setR(), setL() - похожи на setW(). Все это работает довольно неплохо, только при нажатии любой клавиши сначала выполняется действие (меньше секунды) потом перестает двигаться (еще меньше времени) и после этого нормально движется пока нажата клавиша. (например нажав w он едет вперед меньше секунды - встает на короткое время - едет вперед пока нажата клавиша) Можно ли это как-нибудь исправить? А так же оказалось, что все работает хорошо только на расстоянии около метра от компьютера, дальше отклик становится все хуже. Дело в HC-05 или во встроенном Bluetooth? Скорость 9600 (Почему то модуль сразу был с такой скоростью, но я думаю мне 38400 все равно не нужно?) И поможет ли удлинение антенны HC-05?
illusive
 
Сообщения: 20
Зарегистрирован: 23 фев 2013, 16:28

Re: C++ клавиши

Сообщение noonv » 01 мар 2013, 21:20

illusive писал(а):тогда буду пользоваться cvWaitKey(33) (кстати, почему во всех примерах именно 33?)

1000/33 = ~30 Гц
illusive писал(а):только при нажатии любой клавиши сначала выполняется действие (меньше секунды) потом перестает двигаться

так вы же сами останавливаете:
Код: Выделить всё
stopMove(); // <---
moveForward();

возможно, стоит немного пересмотреть логику работы - выполнять остановку только по отдельной команде, например.

illusive писал(а):дальше отклик становится все хуже. Дело в HC-05 или во встроенном Bluetooth?

странно - у меня без проблем в пределах квартиры работает.
попробуйте написать тестовый скетч постоянной записи в порт, например, системного тика и походите с модулем по квартире, а на ПК посмотрите - результат.
Аватара пользователя
noonv
Администратор
 
Сообщения: 557
Зарегистрирован: 05 май 2011, 15:44
Откуда: Калининград
programming: С++

Re: C++ клавиши

Сообщение illusive » 08 мар 2013, 14:57

Спасибо за советы, noonv. Оказалось что дальше 2-3 метров связь теряется, но у меня лежал старый bt usb донгл. С ним все хорошо работает.
illusive
 
Сообщения: 20
Зарегистрирован: 23 фев 2013, 16:28


Вернуться в Программирование

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

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

cron
© 2009-2019 |  О проекте  |  Политика Конфиденциальности  |