Serial.begin (9600) là gì?


Câu trả lời:


22

Serial.begin(9600)không thực sự in bất cứ điều gì. Cho rằng bạn muốn sử dụng Serial.print("Hello world!")để in văn bản "Xin chào thế giới!" đến bàn điều khiển nối tiếp. Thay vào đó, nó khởi tạo kết nối nối tiếp ở 9600 bit mỗi giây.

Cả hai mặt của kết nối nối tiếp (tức là Arduino và máy tính của bạn) cần được thiết lập để sử dụng cùng một kết nối nối tiếp tốc độ để có được bất kỳ loại dữ liệu dễ hiểu nào. Nếu có sự không phù hợp giữa những gì hai hệ thống nghĩ rằng tốc độ thì dữ liệu sẽ bị cắt xén.

9600 bit mỗi giây là mặc định cho Arduino và hoàn toàn phù hợp với đa số người dùng, nhưng bạn có thể thay đổi nó sang tốc độ khác: Serial.begin(57600)sẽ đặt Arduino truyền ở mức 57600 bit mỗi giây. Bạn cần đặt bất kỳ phần mềm nào bạn đang sử dụng trên máy tính của mình (như màn hình nối tiếp của Arduino IDE) với cùng tốc độ để xem dữ liệu được gửi.


2
Baud và BPS là hai thứ khác nhau ... không thể tìm thấy liên kết mà tôi đang tìm kiếm bây giờ.
Chim cánh cụt vô danh

nếu tôi đặt "serial.begin (0);" hoặc "Nối tiếp.begin (4000);". Ý tôi là tôi muốn biết sự khác biệt giữa các con số là gì?
shajib0o

3
Serial.begin được sử dụng để đặt tốc độ giao tiếp, tính bằng bit trên giây. Một byte bằng 8 bit, nhưng các kết nối nối tiếp gửi bit start và stop để xác định điểm bắt đầu và kết thúc của một byte cụ thể đến hệ thống nhận. Vì vậy, cần 10 bit để gửi một ký tự. Việc sử dụng Serial.begin(0)nói với Arduino rằng nó sẽ giao tiếp với nối tiếp với tốc độ 0 bit mỗi giây. Như bạn có thể mong đợi, điều này có nghĩa là Arduino sẽ không bao giờ gửi bất kỳ dữ liệu nào cả. Serial.begin(4000)sẽ khiến Arduino gửi dữ liệu với tốc độ 4000 bit mỗi giây. Điều này là không chuẩn, nhưng nếu không thì tốt.
heypete

2
Tóm lại: thay đổi số thay đổi tốc độ. Làm cho số nhỏ hơn (ví dụ Serial.begin(300)) có Arduino gửi dữ liệu chậm hơn. Tăng nó, nói đến 57600 sẽ gửi dữ liệu nhanh hơn. Cả hệ thống gửi và hệ thống nhận đều cần thống nhất về tốc độ sử dụng: chương trình nối tiếp của máy tính của bạn, như cửa sổ Arduino serial Monitor, sẽ cho phép bạn đặt tốc độ mà máy tính của bạn sẽ nhận dữ liệu nhưng bạn chỉ có thể chọn từ phổ biến tốc độ: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 và 11520 bit / giây. Bạn không thể nhập các tốc độ khác, như 4000. 9600 thường tốt.
heypete

Baud and BPS are two different things... can't find the link I was looking for now.- Đây là một lời giải thích: Phụ lục C: "baud" so với "bps"
Nick Gammon

21

Một bức tranh đáng giá 1000 từ, vì vậy họ nói, (1024 từ nếu bạn làm việc với máy tính) vì vậy tôi sẽ đăng một số hình ảnh ...

Tôi đã thiết lập Uno của mình để gửi "Fab" ở 9600 baud và thu được kết quả trên máy phân tích logic.

Comms nối tiếp - 3 chữ cái

Các phần được tô màu đỏ là khoảng thời gian "nhàn rỗi" giữa các byte.

Từ lưu ý đồ họa ở trên, dòng dữ liệu Tx (truyền) thường cao (1) cho đến khi nó giảm xuống thấp để biểu thị sự bắt đầu của một ký tự (byte). Đây là bit bắt đầu . Sau đó, 8 bit dữ liệu (được biểu thị bằng các chấm trắng) xuất hiện ở tốc độ baud (9600 mẫu mỗi giây). Sau đó, dòng được đưa cao trở lại. Đây là bit stop (phần màu đỏ). Sau đó, chúng ta thấy bit bắt đầu cho nhân vật tiếp theo, v.v. Phần "dừng" có thể dài vô tận, tuy nhiên nó phải dài ít nhất một bit.


Chi tiết hơn cho ký tự đầu tiên (chữ "F" hoặc 0x46 hoặc 0b01000110) có thể được xem tại đây:

Comms nối tiếp - một byte đơn

  • A - không có dữ liệu (Tx cao)

  • B - "bit bắt đầu". Dòng được lấy ở mức thấp để báo cho người nhận biết rằng một ký tự (byte) đang bắt đầu được gửi. Người nhận chờ một giờ rưỡi đồng hồ trước khi lấy mẫu dòng.

  • C - Ký tự đầu tiên đến (chữ "F" hoặc 0x46 hoặc 0b01000110). Không có bit đồng hồ như vậy, dữ liệu đến được lấy mẫu đơn giản ở tốc độ baud (truyền). Ngược lại với giao tiếp SPI, dữ liệu đến bit đầu tiên ít nhất (trong trường hợp bạn không gửi 8 bit cho mỗi byte). Do đó, chúng tôi thấy 01100010 (chứ không phải 01000110).

  • D - Bit dừng. Giá trị này luôn cao, để đảm bảo rằng chúng ta có thể phân biệt giữa phần cuối của byte này và phần đầu của phần tiếp theo. Vì bit start là 0 và bit stop là một nên luôn có sự chuyển đổi rõ ràng từ một byte sang byte kế tiếp.

  • E - Bit bắt đầu cho ký tự tiếp theo.


Bạn có thể thấy từ bản chụp phân tích logic T1 - T2là 0,1041667 ms và khi nó xảy ra là 1/9600:

1 / 9600 = 0.00010416666 seconds

Do đó, tốc độ 9600 cung cấp cho bạn số bit mỗi giây và nghịch đảo là khoảng thời gian giữa các bit .


Những ý kiến ​​khác

  • Comms nối tiếp không tự đồng hồ (không giống như SPI hoặc I2C và các loại khác) do đó cả người gửi và người nhận phải đồng ý về tốc độ xung nhịp.

  • Tốc độ xung nhịp không chính xác trên Arduino, vì phần cứng phải chia đồng hồ hệ thống xuống để có được đồng hồ nối tiếp, và sự phân chia không phải lúc nào cũng chính xác. Hầu như luôn luôn có một lỗi, số tiền được đưa ra trong biểu dữ liệu (số liệu được trích dẫn cho đồng hồ hệ thống 16 MHz, chẳng hạn như trên Uno):

    Lỗi tốc độ baud nối tiếp

  • Bạn có thể thay đổi số lượng bit dữ liệu, bạn không phải gửi 8 trong số chúng, thực tế bạn có thể gửi 5 đến 9 bit.

  • Có thể có một bit chẵn lẻ được gửi sau các bit dữ liệu.

    • Nếu bạn chỉ định tính chẵn lẻ "lẻ", bit chẵn lẻ được đặt theo cách sao cho tổng số bit 1 là số lẻ.
    • Nếu bạn chỉ định tính chẵn lẻ "chẵn", bit chẵn lẻ được đặt theo cách sao cho tổng số bit 1 chẵn.
    • Nếu bạn chỉ định không có chẵn lẻ, bit chẵn lẻ sẽ bị bỏ qua.

    Điều này có thể giúp người nhận phát hiện nếu dữ liệu đến chính xác hay không.

  • Bit chẵn lẻ được gửi trước bit stop.

  • Trong trường hợp 9 bit dữ liệu (như được sử dụng trong giao thức SeaTalk), bit chẵn lẻ được tái định nghĩa là bit dữ liệu thứ 9. Do đó, bạn không thể có cả 9 bit dữ liệu và một bit chẵn lẻ.

  • Bạn cũng có thể có hai bit stop. Điều này về cơ bản chỉ kéo dài thời gian giữa các byte. Trong "thời xa xưa", điều này là để các thiết bị cơ điện chậm có thể xử lý byte trước đó (ví dụ: để in nó).


Có thể tham nhũng

Nếu bạn bắt đầu nghe dữ liệu nối tiếp ở giữa luồng, có khả năng 0 bit ở giữa luồng sẽ được hiểu là bit bắt đầu, và sau đó người nhận sẽ hiểu mọi thứ sau đó không chính xác.

Cách thực sự duy nhất để phục hồi từ điều này là có một khoảng cách đủ lớn, theo thời gian, (ví dụ: 10 bit dài) mà điều này không thể xảy ra.


Logic đảo ngược

Các bit hiển thị ở đây (mức logic) không được đảo ngược. Nghĩa là, 1 bit là CAO và 0 bit là THẤP. Nếu bạn có thiết bị RS232 có thể sẽ gửi một cái gì đó như -12 V cho 1 bit và +12 V cho 0 bit. Điều này được đảo ngược bởi vì một số nhỏ hơn 0, điện áp khôn ngoan.

Nếu bạn có các thiết bị như vậy, bạn cần thực hiện chuyển đổi điện áp và đảo ngược logic. Các chip như MAX 232 sẽ làm cả hai cho bạn. Họ cũng có thể cung cấp -12 V cần thiết để lái các thiết bị như vậy bằng cách tạo ra nó bên trong với sự trợ giúp của một vài tụ điện do người dùng cung cấp.


Quy tắc tốc độ

Vì, với một bit start, 8 bit dữ liệu và một bit stop, chúng ta có tổng cộng 10 bit, theo quy tắc nhanh, bạn có thể tính số byte bạn có thể truyền trong một giây bằng cách chia tốc độ bit cho 10 .

Ví dụ. Với 9600 BPS, bạn có thể gửi 960 byte mỗi giây.


Mã để sao chép:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }

1

; TLDR; Nó khởi tạo cổng giao tiếp nối tiếp và đặt tốc độ truyền. Thiết bị bạn đang liên lạc với (hoặc Arduino IDE serial Monitor) phải được đặt thành tốc độ truyền phù hợp. Khi bạn đã khởi tạo cổng, bạn có thể bắt đầu gửi hoặc nhận ký tự. Tham khảo nối tiếp Arduino


Không làm giảm hoặc thiếu tôn trọng @ Nick-Gammon bảo hiểm tuyệt vời của chủ đề này.
linhartr22

-3

Nó chỉ định chương trình hoạt động bên trong hệ thống máy tính. Các số chỉ định tốc độ.Serial.print chỉ định văn bản nào sẽ được hiển thị


3
Điều này thêm gì vào câu trả lời hiện đang được chấp nhận?
Ignacio Vazquez-Abrams

1
Câu trả lời vô ích, bỏ phiếu để xóa
smirkingman
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.