Связь через RS485C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Связь через RS485

Сообщение Anonymous »

У меня есть одноплатный компьютер, подключенный к другому устройству через RS485. Компьютер должен отправить запрос устройству и получить ответ (используя протокол, зависящий от устройства). Я могу без проблем отправлять сообщения, и устройство их получает (например, я могу изменить параметры устройства). Проблема возникает, когда я хочу прочитать параметры с устройства. В этом случае я получаю неправильные ответы (неправильные символы, смещенные сообщения, неполные сообщения...).

Вот мой код инициализации:

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

Bool
SerialCommunicator::initPort()
{
if (isInitialized_)
return true;

if (!paramSet())
return false;

bzero( &termIO_, sizeof ( struct termios ));
termIO_.c_iflag    |= IGNBRK | IGNPAR;
termIO_.c_cflag    |= CREAD | CLOCAL;
termIO_.c_cflag    |= CS8;
termIO_.c_oflag    |= 0;
termIO_.c_lflag    |= 0;

termIO_.c_cc[VTIME]    = 0;
termIO_.c_cc[VMIN]     = 13; // number of frame characters

String path("/dev/tty" + portSuffix_);
serHandle_ = open(path.c_str(), O_RDWR /*| O_NOCTTY*/);
if (serHandle_ > -1)
{
isInitialized_ = (cfsetispeed(&termIO_, B19200) == 0)
&& (cfsetospeed(&termIO_, B19200) == 0);
isInitialized_ = isInitialized_ && (tcsetattr(serHandle_, TCSANOW, &termIO_) == 0);

return isInitialized_;
}
else
return false;
}
Отправить код:

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

Bool
SerialCommunicator::sendFrame(UByte *_frame, UInt _size)
{
FD_ZERO( &wrFd_ );
FD_ZERO( &rdFd_ );
FD_SET( serHandle_, &wrFd_);
FD_SET( serHandle_, &rdFd_);

Int retVal;
aux_gpio_write_settings();
retVal = select(serHandle_+1, &rdFd_, &wrFd_, NULL, &timeval_);
if (retVal > 0)
{
if( FD_ISSET(serHandle_, &wrFd_) )
{

UInt    bytesToSend     = _size;
UInt    bytesSent       = 0;
UInt    bytesSentTotal  = 0;
while ( bytesToSend > 0 )
{
bytesSent   = write( serHandle_, _frame + bytesSentTotal, bytesToSend );
if (bytesSent > 0)
{
bytesToSend     -= bytesSent;
bytesSentTotal  += bytesSent;
}

}
aux_gpio_read_settings();
tcflush(serHandle_, TCIOFLUSH);
return true;
}
}
usleep(SLEEPTIME);
return false;
}
Получить код:

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

Bool
SerialCommunicator::receiveFrame(UByte *_frame, UInt _size)
{
FD_ZERO( &rdFd_ );
FD_ZERO( &wrFd_ );
FD_SET( serHandle_, &rdFd_ );
FD_SET( serHandle_, &wrFd_ );

Bool retVal;
aux_gpio_read_settings();
retVal = select(serHandle_+1, &rdFd_, &wrFd_, NULL, &timeval_);
if (retVal > 0)
{
if( FD_ISSET(serHandle_, &rdFd_) )
{

UInt    bytesToReceive      = _size;
UInt    bytesReceived       = 0;
UInt    bytesReceivedTotal  = 0;
while ( bytesToReceive > 0 )
{
bytesReceived   = read( serHandle_, _frame + bytesReceivedTotal, bytesToReceive );
if (bytesReceived > 0)
{
bytesToReceive      -= bytesReceived;
bytesReceivedTotal  += bytesReceived;
}
}
return true;
}
}
return false;
}
Функции aux_gpio_write_settings() и aux_gpio_read_settings() используются для установки UART (через GPIO) с.т. RS485 может отправлять или получать данные.

Если я использую этот код на своем настольном компьютере с Linux, он работает нормально, поскольку адаптер USB/RS485 автоматически переключается между режимами отправки и получения. На моем одноплатном компьютере мне приходится делать это вручную. По этой причине я думаю, что установка GPIO и получение ответа вызывают проблему синхронизации. Как мне справиться с этой проблемой?

Подробнее здесь: https://stackoverflow.com/questions/180 ... -via-rs485
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Связь C++/Python RS485 через USB, можем ли мы заблокировать уже открытый порт?
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Связь RS485 между C++ и Python, разделение сообщений и получение нескольких приемов
    Anonymous » » в форуме Python
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Android AVC отклонил RS485
    Anonymous » » в форуме Android
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как написать код C++ для запуска на Raspberry Pi для отправки данных через rs485? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Как написать код C++ для запуска на Raspberry Pi для отправки данных через rs485? [закрыто]
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»