mdk(UART // HAL)怎么了?

问题描述 投票:0回答:1

用户代码开始4 这里是右边

        int fputc(int ch,FILE *f)
        {
            HAL_UART_Transmit(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
            return ch;
        }

用户代码开始4 这里错了!

        int fgetc(int ch)
        {
            uint8_t ch;
            HAL_UART_Receive(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
        }

    [wrong][1]
c stm32 hal
1个回答
0
投票

首先,定义为ch inside函数shadows传入的那个。换句话说,您写入本地副本,然后将其丢弃。

然而,即使您did n't具有显式的本地副本,传入的参数也不会在此函数之外受到影响,因为C是通过值传递的-这意味着对ch所做的任何更改都是没有反映回呼叫者。

实际上,根据您的定义,我有点confused,因为在C语言中,fgetc()接受文件指针,而返回字符。因此拥有:

int fgetc(FILE *unused) {
    uint8_t ch;
    HAL_UART_Receive(&huart2, &ch, 1, HAL_MAX_DELAY);
    return ch;
}

此外,由于您将fputc的地址转换为八位位组的地址,因此int调用也可能存在问题。如果您使用的是低端字节序系统,那可能会起作用,因为多字节值的较低内存地址是最低有效部分。例如,使用'A' (0x41)

Increasing addresses -->
| 0x41 | 0x00 | 0x00 | 0x00 | <- as four-octet int
| 0x41 |                      <- as one octet 

在大端系统上,这是行不通的:

Increasing addresses -->
| 0x00 | 0x00 | 0x00 | 0x41 | <- as four-octet int
| 0x00 |                      <- as one octet 

您可以通过简单地将多八位位组的值复制到一个八位位组中来解决此问题,例如:

int fputc(int ch, FILE *unused) {
    uint8_t ch8 = ch;
    HAL_UART_Transmit(&huart2, &ch8, 1, HAL_MAX_DELAY);
    return ch;
}
© www.soinside.com 2019 - 2024. All rights reserved.