如何有效地将波特率从 int 转换为 speed_t?

Spa*_*ler 3 c serial-port baud-rate

函数cfsetospeedcfsetispeed 以波特率为类型speed_t

int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
Run Code Online (Sandbox Code Playgroud)

类型speed_t基本上是一个整数,但转换不是解决方案,从 中的波特率定义可以看出termios.h

#define B0  0x00000000
#define B50 0x00000001
#define B75 0x00000002
// ...
#define B9600   0x0000000d
#define B19200  0x0000000e
#define B38400  0x0000000f
Run Code Online (Sandbox Code Playgroud)

当我处理用户输入(例如来自文件)时,我将字符串(例如“9600”)转换为整数 9600,然后转换为 B9600。我基本上是在寻找一种通用的方法来转换以下内容:

// 0 -> B0
// 50 -> B50
// 75 -> B75
// ...
// 9600 -> B9600 
// 19200 -> B19200
// 38400 -> B38400
Run Code Online (Sandbox Code Playgroud)

单程从变换int(如9600)到speed_t(如B9600)是一个开关的情况下的结构。有没有更好的方法来实现这一目标?

Noe*_*oel 5

我遇到需要这个。在此处粘贴 switch case 语句供您复制。

int get_baud(int baud)
{
    switch (baud) {
    case 9600:
        return B9600;
    case 19200:
        return B19200;
    case 38400:
        return B38400;
    case 57600:
        return B57600;
    case 115200:
        return B115200;
    case 230400:
        return B230400;
    case 460800:
        return B460800;
    case 500000:
        return B500000;
    case 576000:
        return B576000;
    case 921600:
        return B921600;
    case 1000000:
        return B1000000;
    case 1152000:
        return B1152000;
    case 1500000:
        return B1500000;
    case 2000000:
        return B2000000;
    case 2500000:
        return B2500000;
    case 3000000:
        return B3000000;
    case 3500000:
        return B3500000;
    case 4000000:
        return B4000000;
    default: 
        return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,linux 中的“speed_t”是无符号的,因此返回 -1 可能不是您想要的。请参阅 https://code.woboq.org/userspace/glibc/sysdeps/unix/sysv/linux/bits/termios.h.html (2认同)

Jab*_*cky 4

您需要一个查找表,但不是一个简单的查找表:

#include <stdio.h>    
#include <termios.h>       

struct
{
  int rawrate;
  int termiosrate;
} conversiontable[] =
{
  {0, B0},
  {50, B50},
  {75, B75},
  // you need to complete the table with B110 to B38400
};

int convertbaudrate(int rawrate)
{
  for (int i = 0; i < sizeof(conversiontable) / sizeof(conversiontable[0]); i++)
  {
    if (conversiontable[i].rawrate == rawrate)
    {
      return conversiontable[i].termiosrate;
    }
  }

  return -1;    // invalid baud rate
}

int main()
{
  printf("%d -> %d\n", 50, convertbaudrate(50));
  printf("%d -> %d\n", 75, convertbaudrate(75));
}
Run Code Online (Sandbox Code Playgroud)

那应该自动解释。如果没有,请评论。

  • 好的,我做到了:““过早优化”是一个短语,用于描述程序员让性能考虑因素影响一段代码的设计的情况。这可能会导致设计不那么干净或代码不正确,因为优化使代码变得复杂,并且程序员因优化而分心。现在,我理解错了什么?我建议让代码保持干净和简单,并给编译器优化的机会,这与过早优化恰恰相反 (4认同)
  • 现在这个评论在这里不公平,用 switch/case 语句保持简单并让编译器进行优化与过早优化完全相反。 (3认同)