Câu trả lời:
Đó là bởi vì bạn đang sử dụng exit(0)
. Điều đó tắt ngắt và đi vào một vòng lặp vô hạn. Tuy nhiên, in nối tiếp trước tiên được đặt vào một bộ đệm và sau đó lần lượt từng ký tự được xóa khỏi bộ đệm đó và được gửi qua cổng nối tiếp.
Điều đó hoàn toàn ổn, cho đến khi bạn sử dụng exit(0);
và những gì còn lại trong bộ đệm nối tiếp để gửi không bao giờ được gửi vì các ngắt bị vô hiệu hóa.
Không bao giờ thực sự có bất kỳ nguyên nhân nào để sử dụng exit()
trên một vi điều khiển - sau tất cả, nó có thể "thoát" đến đâu? Không có hệ điều hành để thoát. Vì vậy, nó làm điều tốt nhất tiếp theo gần như không làm gì hết mức có thể.
Thay vào đó, nếu bạn muốn "dừng" chương trình của mình, bạn nên sử dụng một đơn giản while(1);
cho phép ngắt vẫn kích hoạt.
Ngoài ra, nếu bạn thực sự muốn sử dụng exit()
, bạn nên flush
nối tiếp trước:
Serial.flush();
Hàm đó sẽ chặn cho đến khi bộ đệm truyền được làm trống hoàn toàn bởi ngắt và byte cuối cùng đã rời khỏi thanh ghi dịch chuyển TX của UART.
exit()
một vi điều khiển. Thay vào đó, người ta không nên gọi một vòng lặp vô hạn đơn giản exit()
, cho thấy đó là một hàm POSIX thích hợp.