gpt4 book ai didi

c - 为什么输入和输出波特率总是一样的?

转载 作者:IT王子 更新时间:2023-10-29 00:44:14 35 4
gpt4 key购买 nike

我有一个简单的程序可以设置串行 (RS232) 端口的波特率。我正在使用 cfsetospeed()cfsetispeed() 函数独立设置输入和输出速率。根据 man page ,如果我使用这些函数和适当的常量,这应该是可能的:

cfsetispeed() 将存储在 termios 结构中的输入波特率设置为速度,它必须指定为上面为 cfsetospeed() 列出的 Bnnn 常量之一。如果输入波特率设置为零,输入波特率将等于输出波特率。

cfsetospeed() 将存储在 termios_p 指向的 termios 结构中的输出波特率设置为速度,它必须是以下常量之一:
...
B600
...
B19200

我的问题是无论我设置第二个(输入还是输出)似乎都是两者的最终值。我正在尝试设置两个独立的速度。

代码:

int main() {
int fd, ret;
char buf[100] = {0};
char buf2[100] = {0};
struct termios options;

// Open the serial-USB device driver
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if(fd < 0){
perror("open_port: Unable to open port - ");
return 1;
}

tcgetattr(fd, &options); //Get the current settings

cfsetospeed(&options, B9600); //Set input speed as 9600 Baud Rate
cfsetispeed(&options, B19200); //Set output speed as 19200 Baud Rate

ret= tcsetattr(fd, TCSANOW, &options); //Get the return to make sure it worked

sleep(3); // Just for kicks, let it "settle"

tcgetattr(fd, &options); //Read back the values

getBRate(buf, cfgetispeed(&options));
getBRate(buf2, cfgetospeed(&options));

printf("return code was: %d, ispeed %s, ospeed %s\n", ret, buf, buf2);

//Clean up
memset(buf, '0', 100);
memset(buf2, '0', 100);
close(fd);

return 0;
}

我的 getBRate() 函数只是一个简单的(丑陋的)开关,用于返回波特率的字符串版本:

void getBRate(char rate[], speed_t brate)
{

switch(brate) {
case B0: strcpy(rate,"none"); break;
case B50: strcpy(rate,"50 Baud");break;
case B110: strcpy(rate,"110 Baud");break;
case B134: strcpy(rate,"134 Baud");break;
case B150: strcpy(rate,"150 Baud");break;
case B200: strcpy(rate,"200 Baud");break;
case B300: strcpy(rate,"300 Baud");break;
case B600: strcpy(rate,"600 Baud");break;
case B1200: strcpy(rate,"1200 Baud");break;
case B1800: strcpy(rate,"1800 Baud");break;
case B2400: strcpy(rate,"2400 Baud");break;
case B4800: strcpy(rate,"4800 Baud");break;
case B9600: strcpy(rate,"9600 Baud");break;
case B19200: strcpy(rate,"19200 Baud");break;
default: strcpy(rate, "No valid baud found\n");break;
}
return;
}

这里的输出将是:

return code was: 0, ispeed 19200 Baud, ospeed 19200 Baud

如果我像这样反转两个“设置”行:

cfsetispeed(&options, B19200);  //Set output speed as 19200 Baud Rate
cfsetospeed(&options, B9600); //Set input speed as 9600 Baud Rate

我的输出将变为:

return code was: 0, ispeed 9600 Baud, ospeed 9600 Baud

有什么想法吗?

编辑:
由于问题出现,此代码将在使用 Coldfire 528X(5280 或 5282)的板上运行。无论如何,根据 UART 的引用手册,RX 和 TX 应该能够有不同的速率:

23.3.4 UART 时钟选择寄存器 (UCSRn)
UCSR 选择 DTIN 输入上的外部时钟(除以 1 或 16)或预分频的内部总线时钟作为发送器和接收器的时钟源。请参见第 23.4.1 节“发送器/接收器时钟源”。发送器和接收器可以使用不同的时钟源。

最佳答案

现在我将接受@TJD 的回答作为事实 在我处理过的所有芯片中,串行端口硬件实际上只有一个波特率发生器,因此无法处理不同的 Tx 和Rx 波特率。

至于我没有看到任何错误这一事实,那是因为 tcsetattr() 的至少一个请求操作确实成功了 this page状态:

如果 tcsetattr() 函数能够执行任何请求的操作,即使无法执行某些请求的操作,它也会成功返回。

所以现在,我猜硬件没有能力支持这个,但我从 set 函数中成功返回,因为它设置了我请求的两个东西之一。

关于c - 为什么输入和输出波特率总是一样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12920108/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com