что не так в mdk (UART // HAL)? - PullRequest
       84

что не так в mdk (UART // HAL)?

0 голосов
/ 22 апреля 2020

КОД ПОЛЬЗОВАТЕЛЯ НАЧИНАЕТСЯ 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);
        }

неправильно

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

вы не вводите параметр для fget c и у вас должны быть разные имена для ваших переменных

, и вы просто ничего не возвращаете

    int fgetc(void)
    {
        uint8_t ch;
        HAL_UART_Receive(&huart2,(uint8_t *)&ch,1,HAL_MAX_DELAY);
        return ch;
    }
1 голос
/ 22 апреля 2020

Для начала, это определение ch внутри функции shadows той, что было передано. Другими словами, вы пишете в локальную копию, а затем выбрасываете ее.

Однако даже если у вас нет явной локальной копии, переданный параметр не будет затронут вне этой функции, потому что C передается по значению - это означает, что изменения, вносимые в ch, не отражаются обратно для вызывающей стороны.

На самом деле, я немного смущен вашими определениями, поскольку в C, fgetc() принимает указатель файла и возвращает символ, тогда как ваша функция принимает символ, с которым она ничего не будет делать. Так что, вероятно, было бы более точным иметь:

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

Кроме того, существует также возможная проблема с вашим вызовом fputc, поскольку вы преобразуете адрес int в адрес октета. .

Это, вероятно, сработает, если вы используете систему с прямым порядком байтов, поскольку младший адрес памяти для многооктетного значения является наименее значимой частью. Например, используя 'A' (0x41)

Increasing addresses -->
| 0x41 | 0x00 | 0x00 | 0x00 | <- as four-octet int, little-endian.
| 0x41 |                      <- as one octet.

В системе с прямым порядком байтов это не будет работать:

Increasing addresses -->
| 0x00 | 0x00 | 0x00 | 0x41 | <- as four-octet int, big-endian.
| 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;
}
...