Аппаратное управление потоком с помощью termios (CRTSCTS) для устройства UART

сейчас я общаюсь с устройством через UART в C ++ на Udoo Neo. Для этого я использую termios, чтобы установить соединение и записать данные на устройство.
Для этой цели я хочу использовать аппаратное управление потоком и установить флаг (CRTSCTS) с помощью termios.

Для аппаратного управления потоком данных я подключил линию RTS устройства к платам CTS, а также с помощью осциллографа проверил, что устройство дает мне активный высокий уровень, если он не готов к чтению.

Проблема в том, что я по-прежнему теряю байты в следующем примере, просто рассылая устройство цифрами, но вывод платы говорит о том, что все написано правильно.

Я думал, что UART будет заблокирован при использовании управления потоком HW, так что информация не будет потеряна. Я не правильно понимаю это — или есть ошибка в коде?

Спасибо за помощь

const char dev[] = "/dev/ttymxc4";

int main(int argc, char **argv) {

int fd;
struct termios t; ///< control structure for a general asynchronous interface
// edited code
tcgetattr(fd, &t);

t.c_iflag &= ~(IGNBRK | BRKINT | ICRNL |
INLCR | PARMRK | INPCK | ISTRIP | IXON);
t.c_oflag = 0;
t.c_cflag &= ~(CSIZE | PARENB);
t.c_cflag |= (CS8 | CRTSCTS);

// edited code
t.c_cflag |= (CLOCAL | CREAD);

t.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);

t.c_cc[VMIN]  = 0;
t.c_cc[VTIME] = 0;

cfsetispeed(&t,B57600); /* normal shall be: B115200 Baud */

fd = ::open(dev, O_RDWR);
if (fd==-1) {
printf("UART: cannot open file: %s\n",dev);
return -1;
}

tcsetattr(fd,TCSANOW, &t);

// edited code
fcntl(fd, F_SETFL, 0);

int count = 0;
while (true) {

count++;
std::stringstream output;
output << count << ",";

::write(fd, output.str().c_str(), output.str().length());
printf("%d, writing: %s\n", fd, output.str().c_str());
usleep(10000);
}
return 0;

}

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]