Для начала, это определение 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;
}