在第一个之后printf()
,程序中断了,甚至没有到达下一个printf()
。
void UART_rx(void) {
char rx_buffer[256];
int rx_length = read(uart_filestream, (void*) rx_buffer, sizeof(rx_buffer));
if(rx_length > 0) {
printf("%s", rx_buffer);
printf(" ok");
rx_buffer[12] = '\0';
printf(" ok");
char str_id[4];
char *start;
start = strchr(rx_buffer, ',');
start++;
strcpy(str_id,start);
int id;
id = atoi(str_id);
printf("Liczba typu int: %d, oraz jako ciag znakow: %s\n", id, str_id);
}
}
问题可能在哪里?
该read
调用可能会错过向追加空字节rx_buffer
,这是的%s
格式化程序所必需的printf
。
通过手动添加来做到这一点1:
printf("%*.*s\n", rx_length, rx_length, rx_buffer);
1感谢@JonathanLeffler!
请注意,如果确实要读取字节,则这需要read
只读sizeof(rx_buffer) - 1
以防止缓冲区溢出,因为那样写然后写入是未定义的行为。read
256
rx_length == 256
rx_buffer[256]
笔记:
read
返回ssize_t
。因此声明rx_length
,因为int
可能无法保存ssize_t
非常合适的值。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句