последовательный порт — Как изменить скорость передачи в c / Stack Overflow

Здравствуйте, мне нужен совет о том, как правильно изменить скорость передачи данных порта UART в середине программы.

Чтобы установить связь с моим желаемым подчиненным, мне нужно отправить так называемое «поле разрыва», которое состоит из 13-26 (MIN 11) НИЗКИХ БИТОВ, по UART, так как я думаю, что это не достижимо, как раньше, и после каждых 8 битов UART добавляет старт & стоп бит. У меня была идея достичь этого путем манипулирования полем перерыва при отправке со скоростью 9600 бод, а затем скоростью 19200 бод.
Но я не вижу разницы между скоростями передачи на осциллографе. Так что я полагаю, что делаю это неправильно.

#include <iostream>
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <time.h>
#include <stdlib.h>#define BAUDRATE9600 B9600
#define BAUDRATE19200 B19200
#define PORT "/dev/ttyO4"#define _POSIX_SOURCE 1
main()
{
int fd, c;
struct termios oldtio, newtio, midtio;fd = open(PORT, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) { perror(PORT); exit(-1); }tcgetattr(fd, &oldtio); /* save current port settings *//* set new port settings for canonical input processing */
midtio.c_cflag = BAUDRATE9600 | CS8 | CLOCAL | CSTOPB ;
midtio.c_iflag = IGNPAR | ICRNL;
midtio.c_oflag = 0;
midtio.c_lflag = ICANON;

newtio.c_cflag = BAUDRATE19200 | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR | ICRNL;
newtio.c_oflag = 0;
newtio.c_lflag = ICANON;tcsetattr(fd, TCSANOW, &midtio);
char break[] = {0x00}; // break field (0000 0000)

c = write (fd, break, sizeof(break));

tcsetattr(fd, TCSANOW, &newtio);char sync [] = {0x55};
char PID [] = {0xE2};
char data [] = {0xAA};
char data1 [] = {0xA5};
char check [] = {0xAF};
c = write (fd, sync, sizeof(sync));
c = write (fd, PID, sizeof(PID));
c = write (fd, data, sizeof(data));
c = write (fd, data1, sizeof(data1));
c = write (fd, check, sizeof(check));

/* restore old port settings */
tcsetattr(fd,TCSANOW,&oldtio);
}

Я попробовал это также, установив скорость передачи данных по-другому:

cfsetispeed(&midtio, B9600)
cfset0speed(&midtio, B9600)

cfsetispeed(&newtio, B19200)
cfset0speed(&newtio, B19200)

1

Решение

Мне нужно отправить так называемое «поле разрыва»

Если цель состоит в том, чтобы отправить «перерыв», то вы задали вопрос XY с «Как изменить скорость передачи в c / c ++». Вы не можете создать условие разрыва, манипулируя скоростью передачи. Для достижения перерыва в четверть секунды вам понадобится скорость менее 32 бод.

Условие прерывания можно отправить по последовательному каналу с помощью TCSBRK команда в IOCTL ().

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

1

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

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