Tại sao Serial.print chỉ in một giá trị 0-84 cho mảng 100 số nguyên?


7
int a[100],i;
void setup() {
  Serial.begin(9600);
}

void loop() {
  for(i=0; i<100; i++) {
    a[i] = i;
    Serial.println(a[i]);
  }
  exit(0);
}

Câu trả lời:


26

Đó 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 flushnố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.


2
Và từ câu trả lời này (giả sử hơn 1000 byte RAM), bộ đệm của UART sẽ là 64 byte, chỉ đủ để giữ 15 số còn lại (hai byte + CR + LF mỗi số) với bốn byte còn lại.
TripeHound

Tôi sẽ không nói rằng người ta không nên gọi 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.
Dmitry Grigoryev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.