2016-10-01 255 views
2

我正在實現一個簡單的可見光通信模塊,帶有兩個arduinos,作爲發送器和接收器,短文本消息由120個字符組成。我使用曼徹斯特編碼和開關式調製。波特率arduino

總而言之,在我的消息幀中,使用曼徹斯特編碼以及前導和幀結束字節,有2480位。我設置了一個位週期爲500微秒。在接收器端,我將這個位取樣四次,在(500/4)125微秒。據我所知,由於每一位是500 us,所以有2000 bits/s正在從發送器發送,所以波特率爲9600 bits/s應該工作。但是,9600不能正常工作,並且高於115200的38400以上的波特率正在工作,我可以在接收器中正確解碼這條短消息。

任何人都可以請解釋我的行爲?爲什麼9600的波特率無法正常工作,雖然我只是每秒發送2000位數據。

進一步的信息,我已經設置預分頻器爲128,所以ADC採樣頻率是(16MHz/128)/ 13 = 9.6kHz。

非常感謝。

+0

我很困惑。你設置爲9600,38400或115200? Arduino的硬件串行端口?您是否將光接收器直接送入Arduno UART? –

+0

是的,Serial.begin()中的串口。對不起,沒有說清楚。 – Anne

回答

1

當您突然開始談論「波特率」時,這意味着您正在使用Arduino上的硬件串行端口。如果是這樣,那麼意識到每秒2,000比特(bps)輸入期望9600bps的設備存在問題。

異步UART的工作方式是等待啓動信號(位),然後以當前比特率對下一個(通常)9個信號進行解碼。然後它檢查第9位是停止位;如果不是,則丟棄該字節。

由於您只更改每個9600/2000 = 4.8位,因此第9個「停止」位的可能性將是錯誤的,並且數據將丟失。

我要畫一個ASCII圖(我沒有必要爲一些華麗圖我已經看到了這個網站的資源......)對於我談論的時機。

  • 我將使用該比特流00101101由電路產生的信號,用作爲.比特之間的0毫秒隔板;
  • 我將使用^來指出UART在哪些位採樣;
  • 我將使用*來指示「正確的」字節(只要字節以正確的停止位結束);
  • 我將使用!來指示「不正確」的字節(只要字節以不正確的停止位結束);

當然,我假設波特率爲10,000bps(5而不是4.8 ...)

00000.00000.11111.00000.11111.11111.00000.11111 
^^^^^.^^^^!.......^^^^^.^^^^*.......^^^^^.^^^^* 

該序列將導致UART記錄以下字節:

  1. 錯誤
  2. 0xF0(LSB先被定義...)
  3. 0xF0(首先定義LSb ...)
+0

謝謝你的回答。我沒有得到你所說的改變每4.8位的內容。 :(你可以給我解釋一下嗎?當使用波特率如115200時,它是如何變化的,它在每57.6位發生變化? – Anne

+0

這就是我不明白的 - 爲什麼轉換到更高的波特率奇蹟般地工作。我要用一個「圖表」來放大我的答案 - 請原諒這種不合理 –

+0

非常感謝。爲了讓我的問題更清楚:在發射機方面,我將LED連接到數字引腳2(不在TX在接收端,光電二極管連接到模擬引腳3.發送器和接收器的位週期固定爲500μs,發送器和接收器的位週期固定爲115μs,而發送器和接收器的位週期固定爲11500μs。另外,對於每個字節這是傳輸,我已經添加了一個開始和一個停止位,並通過這種加法和曼徹斯特編碼,每個傳輸的字節= 20位。總共我傳輸2480位 – Anne