【发布时间】:2021-06-09 04:32:31
【问题描述】:
我使用 Debian 9 LXDE 为基于 aarch64 的 SoC (Rockchip RK3399) 编写了一些 C 代码,用于从 GPS 模块接收数据。 GPS 模块连接到我的 SoC 中的 "ttyS4" 端口。我创建了一个 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;
}
我使用 GpsPortInit 初始化 UART 一次,然后如果我收到任何更改波特率的请求,我会使用 set_baudrate 进行更改。
【问题讨论】:
-
我怀疑你的处理器有串口。然而,微控制器很可能有一个。但是,既然您谈到 pthread,您似乎更愿意拥有某种形式的 Linux PC。如果你告诉我们你使用的是什么系统,我就不用猜了。
-
这是一个基于 aarch64 的处理器(rockchip rk3399)与 debian 9 LXDE
-
如果您需要更改波特率,通常您必须关闭所有通信。是您正在使用的 termios 库还是其他什么?
-
所有通信都是指文件描述符?是的,我正在使用 termios lib。
-
自从我使用该库以来一直存在,但现在有了澄清,其他人应该能够给出答案。我冒昧地通过编辑将详细信息添加到问题中。
标签: c linux pthreads uart baud-rate