Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Приглашаем принять участие в работе над нашей Wiki.
  • Наша рассылка: subscribe.ru, content.mail.ru и Google groups.
  • Есть желающие вести новостную ленту "В мире технологий"?
  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
   Начало   Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: работа с com портом по протоколу rs485  (Прочитано 993 раз)
0 Пользователей и 1 Гость смотрят эту тему.
nikkos
Читатель

ru
Offline Offline

« : 18-02-2012 12:52 » 

Добрый день, Знатоки.
Пишу на Visual C++ MFC, Win XP.

Дано: есть китайский микроконтроллер, который управляет шаговым двигателем. Микроконтроллер соединяется с компом по USB и видится в нём как виртуальный com порт. В небольшом мануале на него сказано только что, что он получает команды от компа по протоколу rs485, скорость работы 57600, 8 бит на данные 1 стоповый. Причём каждая команда заканчивается символом возврата каретки.

Сделано: получаю хэндл порта, задаю управляющую информацию и проверяю текущие настройки. В текущих настройках ,  параметр  dwProvSubType=PST_RS232.

Вопросы:1.скажите пожалуйста как(какие?) необходимо задать параметры в структуре dcb для работы по протоколу rs485.
2. И вообще должны ли эти(устанавливаемые) параметры влиять на то, что получается в dwProvSubType?

 приведите пожалуйста пример правильной работы с портом по rs485           
Код функции открытия порта программы:
Код:
bool CCOMPort::Open(int port, int baud)
{
char COM_string[20];
int v=0;
sprintf(COM_string,"\\\\.\\COM%d", port);

    //получаем хэндл порта
m_hFile = CreateFile(COM_string, GENERIC_READ|GENERIC_WRITE, 0, NULL,
   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
if(m_hFile == INVALID_HANDLE_VALUE)
{
return false;
}

//управляющая информацию, которая в реальности располагается в различных регистрах порта
DCB dcb;
GetCommState(m_hFile, &dcb);
dcb.ByteSize = 8;             
dcb.Parity   = NOPARITY;       
dcb.StopBits = ONESTOPBIT;   
dcb.BaudRate = baud;
dcb.EofChar='\r';

//вот тут не знаю что делать...
    dcb.fDtrControl = DTR_CONTROL_ENABLE;//разрешаем использование линии dtr
    dcb.fRtsControl = RTS_CONTROL_ENABLE;//разрешаем использование линии rts
    dcb.fOutxDsrFlow = 0;
    dcb.fOutxCtsFlow = 0;

SetCommState(m_hFile, &dcb);//устанавливаем новые конфигурационные параметры

//параметры таймаута
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier  = 0;
CommTimeOuts.ReadTotalTimeoutConstant    = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant   = 1000;
SetCommTimeouts(m_hFile, &CommTimeOuts);

//текущие настройки коммуникационного устройства и драйвера
COMMPROP properties;
GetCommProperties(m_hFile,&properties);
switch  (properties.dwProvSubType)
{
case  PST_FAX :
v=0;
break;
case  PST_LAT :
v=1;
break;
case  PST_MODEM :
v=2;
break;
case  PST_NETWORK_BRIDGE :
break;
case  PST_PARALLELPORT :
v=4;
break;
case  PST_RS232 :
v=5;
break;
case  PST_RS422 :
v=6;
break;
case  PST_RS423 :
v=7;
break;
case  PST_RS449 :
v=8;
break;
case  PST_SCANNER :
v=9;
break;
case  PST_TCPIP_TELNET :
v=10;
break;
case  PST_UNSPECIFIED :
v=11;
break;
case  PST_X25 :
v=12;
break;
    default :
v=13;

break;

}

this->state = true;
return true;
}
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 18-02-2012 12:57 » 

он получает команды от компа по протоколу rs485

Разве есть такой протокол?
Записан

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

Tom Van Vleck
Sla
Модератор

ua
Online Online
Пол: Мужской

WWW
« Ответ #2 : 18-02-2012 13:01 » 

для PC разницы в работе между RS232 и 485  нет.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
nikkos
Читатель

ru
Offline Offline

« Ответ #3 : 18-02-2012 13:01 » 

простите..  ПО ИНТЕРФЕСУ RS-485

Добавлено через 5 минут и 5 секунд:
для PC разницы в работе между RS232 и 485  нет.

другими словами, структуру dcb оставляю такой как есть и шлю команды?
« Последнее редактирование: 18-02-2012 13:06 от nikkos » Записан
Sla
Модератор

ua
Online Online
Пол: Мужской

WWW
« Ответ #4 : 18-02-2012 13:08 » 

Dale,
Нужно понять откуда у ТС слово "протокол" растет?
От недообразования, он незнания иностранного языка, от "сам придумал"?

оно ж на слуху - передача данных по каналу с интерфкйсом NNN по след. протоколу (описание протокола обмена данными)
канал = RS485, происходит замена  слов "канал с интерфейсом" словом протокол.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
nikkos
Читатель

ru
Offline Offline

« Ответ #5 : 18-02-2012 13:28 » 

Sla, конечно от недообразования
Записан
Sla
Модератор

ua
Online Online
Пол: Мужской

WWW
« Ответ #6 : 18-02-2012 13:36 » 

а у меня  вопрос
Зачем в этой функции анализируется properties.dwProvSubType?
Я так понимаю что это константы?
а что потом делается с локальной переменной   v?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-02-2012 13:40 » 

Dale,
Нужно понять откуда у ТС слово "протокол" растет?
От недообразования, он незнания иностранного языка, от "сам придумал"?

В этом все и дело. Эта задача из разряда таких, в которых нужно сначала досконально разобраться, потом решать.

Самый доступный ресурс для получения начальных знаний - Википедия. Вот что она говорит в статье "RS-485":

Цитата
  • Стандарт RS-485 оговаривает только электрические и временные характеристики интерфейса.
  • Стандарт RS-485 не оговаривает:
    • параметры качества сигнала (допустимый уровень искажений, отражения в длинных линиях,
    • типы соединителей и кабелей,
    • гальваническую развязку линии связи,
    • протокол обмена.

(выделение мое - Dale).

Далее: естественно, что для взаимодействия с девайсом протокол все же необходим. Если RS-485 таковым не является, значит, нужно выяснять, какой именно протокол используется поверх RS-485. Та же Википедия упоминает: LanDrive, ProfiBus DP, ModBus, DMX512, HDLC, DCON. Возможно, используется не перечисленный здесь или вовсе патентованный.

Вот на что нужно обратить внимание прежде всего. А всякие хэндлы и dcb - это вообще дело деcятое.

Так что вопрос насчет протокола - это не мелкая придирка, а повод хорошо подумать, прежде чем продолжать.
Записан

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

Tom Van Vleck
nikkos
Читатель

ru
Offline Offline

« Ответ #8 : 18-02-2012 14:09 » 

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

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 18-02-2012 14:20 » 

nikkos, именно поэтому рекомендую сначала подключить его к компьютеру, запустить эмулятор терминала и вручную попытаться оживить девайс с его помощью.

Уже после того, как станет понятно, что именно нужно отправлять в порт и как интерпретировать ответы девайса (если таковы имеются), имеет смысл писать программу, причем это будет самая легкая часть работы.
Записан

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

Tom Van Vleck
Михалыч
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 18-02-2012 16:01 » 

Микроконтроллер соединяется с компом по USB и видится в нём как виртуальный com порт. В небольшом мануале на него сказано только что, что он получает команды от компа по протоколу rs485, скорость работы 57600, 8 бит на данные 1 стоповый.
Какая-то непонятка... Ладно, протоколы, каналы, интерфейсы перепутаны - это может и проблема чисто китайского перевода быть...
Тут надо попытаться понять, что это вообще за подключение такое: тут и USB и RS485. Отдельно преобразователи USB-RS485 знаю, RS232 в RS485 тоже знаю... Но если тут подключение по USB, прямо к микроконтроллеру, то вроде как абсоютно неважно 485 или 232... Тут только протокольная часть важна. Другое дело, если у этого микроконтроллера преобразователь USB-RS485 внутри, да еще имеет выходы для подключения RS485 дальше, для других контроллеров, в сеть... Тогда это важно, но скорее для управления приемо-передачей, а не для реализации протокольной части.
Записан

Поживем - увидим... Доживем - узнаем... Выживу - учту  Улыбаюсь
Sla
Модератор

ua
Online Online
Пол: Мужской

WWW
« Ответ #11 : 18-02-2012 16:04 » 

Михалыч, та тут как бы, про 485-й только чуть-чуть.
МК подключается через usb, видимо есть драйверок, который показывает его как компорт, возможно, что в реальной работе есть где-то выходы/входы  для подключения "485ых" девайсов
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.16 | SMF © 2011, Simple Machines