如何有效地将baudrate从int转换为speed_t?

问题描述 投票:0回答:2
函数

cfsetospeed

和toke baud率作为类型
cfsetispeed
speed_t

类型
int cfsetispeed(struct termios *termios_p, speed_t speed);
int cfsetospeed(struct termios *termios_p, speed_t speed);
基本上是一个整数,但是铸造不是解决方案,从

speed_t
中的鲍德里特定义可以看出,可以看出。

termios.h

当我处理用户输入(例如,从文件中),我将诸如“ 9600”之类的字符串转换为Integer 9600,然后将其转换为B9600。我基本上正在寻找一种通用方法来转换以下内容:
#define B0  0x00000000
#define B50 0x00000001
#define B75 0x00000002
// ...
#define B9600   0x0000000d
#define B19200  0x0000000e
#define B38400  0x0000000f

一种方法

// 0 -> B0 // 50 -> B50 // 75 -> B75 // ... // 9600 -> B9600 // 19200 -> B19200 // 38400 -> B38400 (例如9600)转换为int

(例如B9600)是开关案例结构。有更好的方法可以实现这一目标吗?
    
我遇到了需要这个。在此处粘贴开关案例语句以供您复制。

speed_t

c serial-port baud-rate
2个回答
10
投票

您需要一张查找桌,但不需要一个天真的桌子:

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;
    }
}

4
投票

我使用一个大三元。我不喜欢它,但是我比IF或切换更好,因为它是一个回报。
#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));
}

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.