Добрый день, Знатоки.
Пишу на 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;
}