Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2017, 09:42   #1
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию Как сравнить два слова на си?

У меня MS-DOS и BorlandC++ 3.0 мне нужно получить команду с другого компьютера через порт COM1 (0x3F8) и если пришла та команда, которая нужна, то выполнить определенное действие, а для этого ее (полученную команду) надо сравнить с заданной командой. Настраиваю com порт
Код:
...
                outportb(port+3,0x80); /*установка dlab в ON*/
		outportb(port+1,0x00); /*устновка старшего байта скорости*/
		outportb(port+0,0x01); /*уст мл. байта скорости 115 000*/
		outportb(port+3,0x03); /* возврат dlab в OFF,
					8 бит,no perity,1 стоп бит */
		outportb(port+1,0x01);	/*уст. прерывание на прием*/
	       inportb(port+3);	/*игнорировать задержку, как?*/
		outportb(port+2,0xC7); /*установка FIFO регистра C7*/
		outportb(port+4,0x0b);	/*включить выходы DTR,RTS,OUT2*/
		inportb(port);  	/*обнуление буфера*/
...
Запускаю цикл в ожидании прерывания и считываю поступившую команду и тут возникают даже два вопроса, как остановить цикл чтения данных правильно? Мне кажется тут два варианта или проверять последние символы в строке с командой, это CR и LF (16cc 0D и 0A) или проверять пустой FIFO буфер com порта или нет? И еще CR и LF на си можно проверить символами \r и \n соотвественно или проверку делать на 0x0D и 0x0A?
пока код написал следующий:
Код:
while (flag==0)
  {

   if (inportb(port+2) & 0x04)
   {
     result=inportb(port);

      strk[anc]=result;
      anc++;
      flag=1;
    }
  }
И вот сам вопрос , если просто сравнивать 2 слова, то наверно можно сравнить командой
Код:
strcmp(a1,a2);
а мне же надо не просто сравнить два слова, а команду например IDN? а за командой должны следовать два символа CR и LF их как проверить есть они или нет? Я пока вижу только возможность перевести команду IDN? посимвольно в 16сс и добавить в конец коды 0x0D и 0x0A и это будет эталон искомой команды, но может быть это слишком сложно и можно как то попроще?
седьмой вне форума Ответить с цитированием
Старый 27.06.2017, 10:03   #2
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

На первый вопрос я кажется сам нашел ответ, можно просто после получения прерывания на сом порте считывать в цикле несколько символов в цикле, например 10, что бы команда поместилась вся наверняка и затем сравнить начало всего массива посимвольно с заданным и все. И на второй тоже, но мне кажется это все можно сделать проще.
седьмой вне форума Ответить с цитированием
Старый 27.06.2017, 10:32   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от седьмой Посмотреть сообщение
после получения прерывания на сом порте считывать в цикле несколько символов в цикле, например 10
Не факт, что все придет сразу.
Надо в прерывании считать все что есть, а потом проверять буфер.
waleri вне форума Ответить с цитированием
Старый 27.06.2017, 12:15   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

В протоколе должна быть некоторая синхронизация, у вас похоже \n\r
Так что, сидеть и читать в буфер, пока не пришли \n\r (или время не вышло, для уверенности, например кабель вылетел)

Дальше сравнивать буфер с образцом, побайтно memcmp
alexzk вне форума Ответить с цитированием
Старый 27.06.2017, 13:37   #5
седьмой
Форумчанин
 
Регистрация: 17.07.2012
Сообщений: 140
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Надо в прерывании считать все что есть, а потом проверять буфер.
Спасибо попробую
Цитата:
Сообщение от alexzk Посмотреть сообщение
Дальше сравнивать буфер с образцом, побайтно memcmp
хорошо, понял, всем спасибо за помощь!
седьмой вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сравнить 2 слова лексикографически? Vitami Общие вопросы C/C++ 13 30.10.2016 15:24
Как сравнить два ексель файла ivkoa Microsoft Office Excel 3 23.10.2014 15:59
Как сравнить два цвета? Andruxai Общие вопросы по Java, Java SE, Kotlin 1 11.12.2013 14:40
Как сравнить два string? demigod82 Общие вопросы C/C++ 3 08.05.2012 23:07
Даны два слова. Получить третье слово из неповторяющихся символов, входящих как в первое, так и во второе слова. dlinkz Паскаль, Turbo Pascal, PascalABC.NET 8 01.02.2012 11:09