1

我正在阅读UART外围设备的源代码,并且有如下功能:

eResult = adi_stdio_ControlDevice (hSTDIOUART,
    ADI_STDIO_COMMAND_SET_UART_BAUD_RATE, (void *)57600);

该函数用于连接UART,数字57600为波特率。我不明白的是 的含义(void*)57600

我认为这可能是一个指针和isconst的返回值。当我们使用时,是否意味着我们正在创建一个指向该值的指针?(void*)5760057600(void*)5760057600

为什么我们必须使用(void*)57600

4

1 回答 1

2

不完全的。“返回值”(引用是因为它实际上不是从函数返回,而是转换的结果)(void *)57600只是57600被视为(或换句话说,转换为)void 指针的值。

而且,虽然您实际上是在转换 57600为 void 指针,但几乎可以肯定它不会被用作指针。更有可能的是,原型adi_stdio_ControlDevice有一个通用参数(一个可以用于许多事情的参数)。

设备控制功能特别容易做到这一点,因为它们是通用的,适用于多种设备,因此您可能必须为调用提供多种类型。

可能会发现,对于设置波特率的命令,它只是在使用之前在另一端转换回一个整数值,例如:

static int localSpeed;
static char *localString;
static double localPi;
static struct rational { int numerator; int denominator } localStruct;

bool adi_stdio_ControlDevice (HANDLE hndl, COMMAND cmd, void *generic) {
    switch (cmd) {
        case ADI_STDIO_COMMAND_SET_UART_BAUD_RATE: {
            localSpeed = (int)generic;
            break;
        }
        case ADI_COMMAND_WITH_STRING_ARG: {
            if (localString) free(localString);
            localString = strdup((char*)generic);
            break;
        }
        case ADI_COMMAND_WITH_DOUBLE_PTR_ARG: {
            localPi = *((double*)generic));
            break;
        }
        case ADI_COMMAND_WITH_STRUCT_PTR: {
            memcpy(localStruct, generic, sizeof(localStruct));
            break;
        }
    }
}

其他命令(例如我添加的假命令)将能够以多种方式使用通用参数,例如整数或其他指针类型。


该调用的文档(VisualDSP++ 5.0 Device Drivers and System Services Manual for Blackfin® Processors)实际上支持这一点,其中指出:

 ADI_STDIO_RESULT adi_stdio_ControlDevice (
   ADI_STDIO_DEVICE_HANDLE hStdioDevice,
   uint32_t nCommandID,
   void *const pValue
 );
 : : :
pValue: 执行命令所需的参数。根据命令,需要不同类型的参数。

于 2019-12-17T04:31:03.823 回答