Seri.begin (9600) nedir?


Yanıtlar:


22

Serial.begin(9600)aslında hiçbir şey basmıyor. Bunun için Serial.print("Hello world!")"Merhaba dünya!" Metnini yazdırmak için kullanmak istersiniz. Seri konsola Aksine, seri bağlantıyı saniyede 9600 bit ile başlatır.

Her türlü anlaşılır veriyi almak için seri bağlantının her iki tarafının (yani Arduino ve bilgisayarınız) aynı hızlı seri bağlantıyı kullanacak şekilde ayarlanması gerekir. İki sistemin hız olduğunu düşündükleri arasında bir uyuşmazlık varsa, o zaman veriler karışacaktır.

Arduino için saniyede 9600 bit varsayılandır ve kullanıcıların çoğu için mükemmel şekilde yeterlidir, ancak bunu diğer hızlara Serial.begin(57600)da ayarlayabilirsiniz : Arduino'yu saniyede 57600 bit hızında iletir. Gönderilen verileri görmek için, bilgisayarınızda (Arduino IDE'nin seri monitörü gibi) kullandığınız yazılımı aynı hızda ayarlamanız gerekir.


2
Baud ve BPS iki farklı şeydir ... aradığım bağlantıyı bulamıyorlar.
Anonim Penguen

peki "Serial.begin (0);" veya "Seri.begin (4000);". Yani, sayılar arasındaki farkın ne olduğunu bilmek istiyorum.
shajib0o

3
Seri.begin, saniyede bit cinsinden iletişim hızını ayarlamak için kullanılır. Bir bayt 8 bite eşittir, ancak seri bağlantılar alıcı sisteme belirli bir bayt için başlangıç ​​ve bitişi tanımlamak için bir başlangıç ​​ve bitiş biti gönderir. Bu nedenle, bir karakter göndermek için 10 bit gerekir. Kullanımı Serial.begin(0)Arduino'ya, seriyle saniyede 0 bit hızında iletişim kurması gerektiğini söyler. Beklediğiniz gibi, bu Arduino'nun hiçbir zaman veri göndermeyeceği anlamına gelir. Serial.begin(4000)Arduino'nun saniyede 4000 bit veri göndermesine neden olur. Bu standart değildir, ancak başka türlü iyidir.
heypete

2
Kısacası: Sayının değiştirilmesi hızı değiştirir. Sayıyı küçültmek (örneğin Serial.begin(300)) Arduino'nun verileri daha yavaş göndermesini sağlar. Bunu arttırmak, 57600’e veriyi daha hızlı göndereceğini söylüyor. Hem gönderen sistemin hem de alıcı sistemin hangi hızda kullanılacağına karar vermesi gerekir: Arduino Seri Monitör penceresi gibi bilgisayarınızın seri programı, bilgisayarınızın veri alacağı hızı ayarlamanıza izin verir, ancak yalnızca genel hızlar: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 ve 11520 bit / sn. 4000 gibi diğer hızlara giremezsiniz. 9600 genellikle iyidir.
heypete

Baud and BPS are two different things... can't find the link I was looking for now.- İşte bir açıklama: Ek C: "baud" vs. "bps"
Nick Gammon

21

Bir resim 1000 kelimeye bedeldir, yani derler ki, (bilgisayarlarla çalışıyorsanız 1024 kelime) bu yüzden bazı resimler göndereceğim ...

Uno'mu 9600 baud'da "Fab" göndermek üzere ayarladım ve sonuçları bir mantık analiz cihazında yakaladım.

Seri haberleşme - 3 harf

Kırmızı gölgeli kısımlar baytlar arasındaki "boş" süredir.

Yukarıdaki grafikte, Tx (gönderme) veri hattının, bir karakterin (bayt) başlangıcını belirtmek için düşük düşene kadar normalde yüksek (1) olduğuna dikkat edin. Bu başlangıç ​​biti . Ardından, 8 veri biti (beyaz noktalar ile gösterilir) baud hızında görünür (saniyede 9600 örnek). Bundan sonra çizgi tekrar yüksek getirdi. Bu, durdurma bitidir (kırmızı kısım). Sonra bir sonraki karakter için başlangıç ​​bitini görürüz. "Durdurma" kısmı süresiz olarak uzun olabilir, ancak en az bir bit uzunluğunda olması gerekir.


İlk karakter için daha fazla ayrıntı ("F" harfi veya 0x46 veya 0b01000110 harfi) burada görülebilir:

Seri haberleşme - tek bayt

  • A - veri yok (Tx yüksek)

  • B - "başlangıç ​​biti". Satır, alıcıya bir karakterin (bayt) gönderilmeye başladığını bildirmek için alçalır. Alıcı, çizgiyi örneklemeden önce bir buçuk saat bekler.

  • C - İlk karakter geldi ("F" veya 0x46 veya 0b01000110 harfi). Böyle bir saat biti yoktur, gelen veriler sadece baud (iletim) hızında örneklenir. SPI iletişiminin aksine, veriler önce en az anlamlı bite ulaşır (bayt başına 8 bit göndermemeniz durumunda). Böylece 01100010 (01000110 yerine) görüyoruz.

  • D - Durdurma biti. Bu, baytın sonu ile bir sonrakinin başlangıcı arasında ayrım yapabilmemiz için daima yüksektir. Başlangıç ​​biti sıfır ve durdurma biti bir olduğundan, her zaman bir bayttan diğerine net bir geçiş vardır.

  • E - Bir sonraki karakter için başlangıç ​​biti.


Lojik analizör yakalamadan T1 - T20.1041667 ms ve 1/9600 olanları görebilirsiniz:

1 / 9600 = 0.00010416666 seconds

Böylece 9600 oranı size saniye başına bit sayısını verir ve tersi bitler arasındaki zaman aralığıdır .


Diğer hususlar

  • Seri haberleşmeler kendiliğinden saatli değildir (SPI veya I2C ve diğerlerinden farklı olarak) bu nedenle hem gönderenin hem de alıcının saat hızı üzerinde anlaşması gerekir.

  • Saat hızı Arduino'da kesin değil, çünkü donanımın seri bir saat elde etmek için sistemin saatini bölmesi gerekiyor ve bölme her zaman kesin değil. Neredeyse her zaman bir hata vardır, miktar veri sayfasında verilmiştir (Uno'daki gibi 16 MHz sistem saati için verilen rakamlar):

    Seri baud hızı hatası

  • Veri bitlerinin sayısını değiştirebilir, bunlardan 8ini göndermek zorunda değilsiniz, aslında 5 ila 9 bitleri gönderebilirsiniz.

  • İsteğe bağlı olarak , veri bitlerinden sonra gönderilen bir eşlik biti olabilir.

    • "Tek" eşlik belirtirseniz, eşlik biti, toplam 1 bitlik sayı tuhaf olacak şekilde ayarlanır.
    • Eşitliği "eşit" olarak belirtirseniz, eşlik biti, toplam 1 bitlik sayının eşit olacağı şekilde ayarlanır.
    • Eşlik belirtmezseniz, eşlik biti atlanır.

    Bu, alıcının verilerin doğru gelip gelmediğini tespit etmesine yardımcı olabilir.

  • Eşlik biti, durdurma bitinden önce gönderilir.

  • 9 veri bitinde (SeaTalk protokolünde kullanıldığı gibi) parite biti 9. veri biti olarak yeniden amaçlanır. Bu nedenle, hem 9 veri bitini hem de bir eşlik biti olamaz.

  • Ayrıca iki stop bitiniz olabilir. Bu temelde sadece baytlar arasındaki süreyi uzatır. "Eski günlerde" bu, elektromekanik ekipmanın önceki baytı (örneğin yazdırmak için) işleyebilmesi içindi.


Muhtemel yolsuzluk

Bir akışın ortasındaki seri verileri dinlemeye başlarsanız, akışın ortasındaki 0 ​​bitinin başlangıç ​​biti olarak yorumlanması ve ardından alıcının her şeyi yanlış yorumlaması olasıdır.

Bundan kurtulmanın tek gerçek yolu, zaman zaman bunun (örneğin, 10 bit uzunluğunda) bunun gerçekleşemeyeceği kadar büyük bir boşluğa sahip olmasıdır.


Ters mantık

Burada gösterilen bit (mantık seviyesi) ters değil. Yani, 1 bit YÜKSEK ve 0 bit LOW'dur. RS232 ekipmanınız varsa, muhtemelen 1 bit için -12 V ve 0 bit için +12 V göndereceksiniz. Bu tersine çevrilir, çünkü biri sıfır voltajdan düşüktür.

Bu tür cihazlara sahipseniz, voltaj dönüşümü ve mantık inversiyonu yapmanız gerekir. MAX232 gibi cipsler sizin için her ikisini de yapacak. Ayrıca, kullanıcı tarafından sağlanan birkaç kondansatörün yardımı ile dahili olarak üreterek bu ekipmanı çalıştırmak için gereken -12 V değerini sağlayabilirler.


Başparmağın hızı

Bir başlangıç ​​biti, 8 veri biti ve bir durdurma biti ile birlikte, toplam 10 bite sahip olduğumuzdan, hızlı bir kural olarak, bir saniyede iletebileceğiniz bayt sayısını 10 bölerek hesaplayabilirsiniz. .

Örneğin. 9600 BPS'de saniyede 960 bayt gönderebilirsiniz.


Yeniden üretilecek kod:

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

void loop ()
  {
  }

1

; TLDR; Seri iletişim portunu başlatır ve baud hızını ayarlar. İletişim kurduğunuz cihazın (veya Arduino IDE Serial Monitor) uygun bir baud hızı ayarlanması gerekir. Bağlantı noktasını başlattıktan sonra karakterleri göndermeye veya almaya başlayabilirsiniz. Arduino Seri Referansı


@ Nick-Gammon'un bu konuyla ilgili mükemmel kapsamını küçümsememek veya saygısızlık etmek.
linhartr22
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.