Я написал код C для SoC на базе aarch64 (Rockchip RK3399) с Debian 9 LXDE, чтобы получать данные от модуля GPS. Модуль GPS подключен к порту ttyS4 в моей SoC. Я создал поток pthread для получения данных от модуля GPS. Я использую библиотеку termios. Итак, мой поток выглядит следующим образом:
- Инициализируйте порт UART (скорость передачи, четность, стоповые биты и т. Д.).
- Создайте поток для получения данных из модуля.
Теперь мне нужно изменить скорость передачи UART при получении скорости передачи от внешнего источника. Я могу получить новую скорость передачи данных, которую мне нужно установить для порта.
Как мне установить новую скорость передачи для порта? Должен ли я pthread_exit()
получить поток, инициализировать порт UART, а затем снова запустить поток?
Или мне просто закрыть fd и инициализировать порт UART с новой скоростью передачи, не выходя из потока?
Или есть какой-либо другой простой способ или функция для установки UART на порт?
Мой код инициализации:
int Gpsfd;
struct termios Gps_termios, Gps_old;
void GpsPortInit(void)
{
char path[12] = "/dev/ttyS4";
//open GSM_termios for tx/rx
Gpsfd = open(path, O_RDWR | O_NOCTTY);
if (Gpsfd < 0)
printf("port failed to open\n");
//save current attributes
tcgetattr(Gpsfd, &Gps_old);
bzero(&Gps_termios, sizeof(Gps_termios));
Gps_termios.c_cflag = CLOCAL | CREAD | CS8;
if (!strcmp(g_sParameters.RS232BaudRate, "9600"))
{
Gps_termios.c_cflag |= B9600;
}
else if (!strcmp(g_sParameters.RS232BaudRate, "19200"))
{
Gps_termios.c_cflag |= B19200;
}
else if (!strcmp(g_sParameters.RS232BaudRate, "57600"))
{
Gps_termios.c_cflag |= B57600;
}
else if (!strcmp(g_sParameters.RS232BaudRate, "115200"))
{
Gps_termios.c_cflag |= B115200;
}
Gps_termios.c_iflag = IGNPAR;
Gps_termios.c_oflag = 0;
Gps_termios.c_lflag = 0;
Gps_termios.c_cc[VTIME] = 0;
Gps_termios.c_cc[VMIN] = 1;
//clean the line and set the attributes
tcflush(Gpsfd, TCIFLUSH);
tcsetattr(Gpsfd, TCSANOW, &Gps_termios);
}
Это функция изменения скорости передачи, предложенная ниже:
int set_baudrate(speed_t speed)
{
//struct termios tty;
if (tcgetattr(Gpsfd, &Gps_termios) < 0) {
printf("Error from tcgetattr1: %s\n", strerror(errno));
return -1;
}
cfsetospeed(&Gps_termios, speed);
cfsetispeed(&Gps_termios, speed);
if (tcsetattr(Gpsfd, TCSANOW, &Gps_termios) != 0) {
printf("Error from tcsetattr: %s\n", strerror(errno));
return -1;
}
tcflush(Gpsfd, TCIOFLUSH); /* discard buffers */
return 0;
}
Я инициализирую UART один раз с помощью GpsPortInit
, и после этого, если я получаю запрос на изменение скорости передачи, я меняю его с помощью set_baudrate
.