RS-232 путаница под C ++ - PullRequest
       9

RS-232 путаница под C ++

4 голосов
/ 04 февраля 2010

В чем проблема в данном коде? Почему он не показывает выход для rs232, когда мы подключаем его через разъем d-9 с коротким замыканием контактов 2 и 3 в этом?

#include <bios.h>
#include <conio.h>
#define COM1       0
#define DATA_READY 0x100
#define SETTINGS ( 0x80 | 0x02 | 0x00 | 0x00)
int main(void)
{
   int in, out, status;
   bioscom(0, SETTINGS, COM1); /*initialize the port*/
   cprintf("Data sent to you:  ");
   while (1)
   {
      status = bioscom(3, 0, COM1); /*wait until get a data*/
      if (status & DATA_READY)
           if ((out = bioscom(2, 0, COM1) & 0x7F) != 0)  /*input a data*/
              putch(out);
           if (kbhit())
           {
              if ((in = getch()) == 27)   /* ASCII of Esc*/
                 break;
              bioscom(1, in, COM1);   /*output a data*/
           }
   }
   return 0;
}

Ответы [ 5 ]

1 голос
/ 04 февраля 2010

Ну, код выглядит хорошо.Действительно ли вы правильно подключили оставшиеся контакты в разъем, см. последовательный и контактный разъем .

0 голосов
/ 20 мая 2010

Я предполагаю из вашего комментария о "контактах 2 и 3", что вы подключили петлевой кабель, поэтому вы ожидаете, что все, что вы наберете, появится на экране (и прекратите делать это, когда вы отключите кабель).

Я думаю, что в коде есть ошибка: if (kbhit()) - это внутри * if (status & DATA_READY).

Это означает, что вы проверяете клавиатуру только в том случае, если есть какой-либо ввод, готовый к приему через последовательный порт - чего не будет, потому что вы еще ничего не отправили! Попробуйте переместить тест и посмотрите, улучшится ли он.

(Вот некоторый аналогичный код последовательного порта , который ставит тест if (kbhit()) вне проверки DATA_READY. Он не претендует на работу, но предоставляет некоторые доказательства того, что это может быть источником проблема ...)

0 голосов
/ 11 мая 2010

Эй, я не эксперт по Win32, но мне кажется, что проще использовать другую статью в качестве источника (упомянутая выше выглядит устаревшей):

http://msdn.microsoft.com/en-us/library/ms810467

Это тоже старая версия, датированная примерно 1995 годом, но она все еще эффективна.Архитектура NT очень ограничена, когда речь идет о предоставлении доступа к оборудованию, например, при отправке байтов на параллельный порт ПК, необходимо использовать обходные пути dll, написанные разработчиками открытого исходного кода.

0 голосов
/ 15 апреля 2010

Перед проверкой своего кода всегда проверяйте последовательную связь с терминальной программой. У меня нет большого опыта работы со средой Windows, но в Linux у вас есть программы, такие как cutecom или gtkterm, где вы можете отправлять / получать данные из последовательного порта. Мы широко использовали эти программы для последовательной связи в Linux, они отлично подходят для отладки потенциальных проблем с интерфейсом последовательного порта (также h / w & s / w). Поэтому, прежде чем заподозрить ваш код, проверьте с помощью программы эмуляции терминала.

0 голосов
/ 14 апреля 2010

Ничто очевидное не выделяется из вашего кода как причина. Проверьте все свои базы, поскольку вы имеете дело с аппаратным / программным обеспечением. В следующей статье Microsoft другая реализация, использующая _bios_serialcom (из bios.h), которая может быть для вас хорошим ориентиром.

http://support.microsoft.com/kb/39501

Предложения, куда идти отсюда:

  1. Я бы также предложил заменить литералы (например, 0x08), используя константы, предварительно определенные для скорости передачи в бодах, Parity (например, _COM_NOPARITY), чтобы сделать код более читабельным в вашем вопросе.

  2. Убедитесь, что порт Com на самом деле открыт, поскольку это предположение не проверяется в приведенном выше примере кода.

  3. Также проверьте штыревые соединения для DB9. Чтобы подключить два компьютера / устройства, вам нужно будет обнулить его, например, с 2 по 3 на другом конце, а также с сигнальной землей. Убедитесь, что вы отключаете / не ищете DTR.

  4. Если другой компьютер / устройство настроен, я бы предложил сначала запустить HyperTerminal (Программы-> Стандартные-> Связь) и подключиться к вашему COM 1 и проверить, что вы видите символы с другого устройства. Если нет, скорее всего, это связано с вашим кабелем.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...