資料介紹
描述
?

介紹
在我的數(shù)字通信課上,我試圖通過發(fā)現(xiàn)領(lǐng)域問題并解決它們來幫助我的學(xué)生學(xué)習(xí)數(shù)字通信/計(jì)算機(jī)網(wǎng)絡(luò)。在上一節(jié)課中,我們使用激光和 LDR構(gòu)建了一個(gè)摩爾斯電碼發(fā)射器/接收器。
今天,我將其擴(kuò)展到傳輸數(shù)字?jǐn)?shù)據(jù);以0和1的流編碼的數(shù)據(jù)。在摩爾斯電碼中,'dot'和'dash'相當(dāng)于數(shù)字?jǐn)?shù)據(jù)的0和1。但是,我們有 0/點(diǎn)的明確信號(hào)。沒有信號(hào)不被解釋為零。這使得渠道成本更高。我可以達(dá)到每分鐘約 18 個(gè)單詞(PARIS 通常用作此計(jì)算的參考單詞)。這相當(dāng)于每分鐘 75 個(gè)字節(jié)或10bps 。
發(fā)射機(jī)
由于我的發(fā)射器是一個(gè)具有開和關(guān)狀態(tài)的激光二極管,關(guān)閉狀態(tài)可以被認(rèn)為是 0,而打開狀態(tài)可以被認(rèn)為是 1。然而,這提出了一個(gè)挑戰(zhàn),即如何區(qū)分代表數(shù)據(jù)的一組 0 和0代表靜默(沒有數(shù)據(jù)傳輸)。
編輯代碼
由于我們遇到了這個(gè)問題,我添加了一個(gè)開始消息頭/模式 (1011) 和一個(gè)結(jié)束消息頭/模式 (1101)。我不斷地在我的 LDR 接收器上采樣數(shù)據(jù),并將讀取值 0/1 添加到我的數(shù)據(jù)中。然后,我檢查結(jié)束模式,如果找到,我檢查 8 位數(shù)據(jù)之前的起始標(biāo)頭。
1011 <8 位數(shù)據(jù)> 1101
H: 1011010010001101
E: 1011010001011101
L: 1011010011001101
L: 1011010011001101
O: 1011010011111101
我可以在我的接收器上解碼這個(gè)模式。

然而,這種封裝消息的簡單模式并非萬無一失。它很容易被流氓數(shù)據(jù)系列破解。

那么如何驗(yàn)證接收到的數(shù)據(jù)是否真的是另一端發(fā)送的數(shù)據(jù)呢?
我在數(shù)據(jù)末尾添加了一個(gè)小簽名;設(shè)置位數(shù)。由于我的數(shù)據(jù)是 8 位,我又添加了 4 位來表示可以在數(shù)據(jù)中設(shè)置的最多 8 位。
1011 <8_bit_data><4_sign_bits> 1101
H: 10110100100000101101
E: 10110100010100111101
L: 10110100110000111101
L: 10110100110000111101
O: 10110100111101011101
我也可以解碼這個(gè)模式。結(jié)果,我可以過濾掉一些垃圾:

我確實(shí)有數(shù)據(jù)丟失,但現(xiàn)在垃圾更少了。那么我該如何進(jìn)一步改進(jìn)呢?我可以修復(fù)傳輸錯(cuò)誤嗎?我可以更好地利用符號(hào)位嗎?大量可能的改進(jìn),但當(dāng)我們遇到問題并且我們確信該問題值得解決時(shí),我們將解決。可能是下節(jié)課……
發(fā)射機(jī):
#define PULSE 50
#define START_MSG one(); zero(); one(); one();
#define ??END_MSG one(); one(); zero(); one();
#define MSG_PACK(x) START_MSG x END_MSG
void setup() {
?pinMode(13, OUTPUT);
}
void loop() {
// <8_Data_Bits><4_Sign_Bits>
?//H: 2 set bits
?MSG_PACK(zero(); one(); zero(); zero(); one(); zero(); zero(); zero(); \
??????????zero(); zero(); one(); zero(); )
?//E: 3 set bits
?MSG_PACK(zero(); one(); zero(); zero(); zero(); one(); zero(); one(); \
??????????zero(); zero(); one(); one(); )
?//L: 3 set bits
?MSG_PACK(zero(); one(); zero(); zero(); one(); one(); zero(); zero(); \
??????????zero(); zero(); one(); one(); )
?//L: 3 set bits
?MSG_PACK(zero(); one(); zero(); zero(); one(); one(); zero(); zero(); \
??????????zero(); zero(); one(); one(); )
?//O: 5 set bits
?MSG_PACK(zero(); one(); zero(); zero(); one(); one(); one(); one(); \
??????????zero(); one(); zero(); one(); )
?//CR: 3 set bits
?MSG_PACK(zero(); zero(); zero(); zero(); one(); one(); zero(); one(); \
??????????zero(); zero(); one(); one(); )
?//LF: 2 set bits
?MSG_PACK(zero(); zero(); zero(); zero(); one(); zero(); one(); zero(); \
??????????zero(); zero(); one(); zero(); )
}
void zero()
{
?digitalWrite(13, LOW);
?delay(PULSE);
}
void one()
{
?digitalWrite(13, HIGH);
?delay(PULSE);
}
接收者:
#define SOM 0xB
#define EOM 0xD
#define PULSE 50
unsigned long data = 0;
void setup() {
?// put your setup code here, to run once:
?Serial.begin(9600);
}
void loop() {
?// put your main code here, to run repeatedly:
?int val = analogRead(4);
?unsigned long sign = 0;
?data = (data << 1);
?if(val >= 10){
???data |= 1;
?}else {
???data |= 0;
?}
?//check tail signature
?if(EOM == (data&EOM))
?{
???//check head signature
???if(SOM == ((data >> 16)&0xF)){
?????sign = (data>>4)&0xF; // 4 bits of signature
?????data = (data>>8)&0xFF;// 8 bits of data
?????if(sign == getSetBits(data))
?????{
???????Serial.print((char)data);
?????}
?????//Diagnostics
?????//if(data==72||data==69||data==76||data==79||data==13||data==10){
???????//data
???????//digitalWrite(13, HIGH);
?????//}else{
???????//error
???????//digitalWrite(12, HIGH);
?????//}
?????data = 0;
???}
?}
?delay(PULSE);
?//digitalWrite(13, LOW);
?//digitalWrite(12, LOW);
}
unsigned long getSetBits(unsigned long n)
{
?unsigned long count = 0;
?while(n)
?{
???n &= (n-1);
???count++;
?}
?return count;
}
順便說一句,我使用此處發(fā)布的最終代碼實(shí)現(xiàn)了每秒約 1 字節(jié)數(shù)據(jù)的速度。包括標(biāo)頭在內(nèi),達(dá)到每秒 20 位!
編輯
為了檢測(cè)數(shù)據(jù)中的錯(cuò)誤,我在數(shù)據(jù)中添加設(shè)置位數(shù)的簽名機(jī)制并沒有被證明是好的。我需要一個(gè)不會(huì)增加大量數(shù)據(jù)開銷的更好、更便宜的解決方案。
I XOR 高半字節(jié)和低半字節(jié)以生成 4 位簽名。此簽名不太可能失敗,因?yàn)殄e(cuò)誤(位翻轉(zhuǎn))必須發(fā)生在高半字節(jié)和低半字節(jié)的相應(yīng)位上。
// (sign == (right ^ left))
if(sign == ((data & 0xF) ^ ((data >> 4) & 0xF))){
Serial.print((char)data);
}
正如預(yù)期的那樣,結(jié)果比以前更好。我很少看到惡意字節(jié)通過此測(cè)試。

在理想情況下,我不會(huì)出錯(cuò)。我還沒有看到流氓字節(jié),但我確實(shí)看到數(shù)據(jù)包被丟棄了。我如何確保以正確的順序收到所有數(shù)據(jù)?
這是下一個(gè)要解決的問題。為每個(gè)數(shù)據(jù)包構(gòu)建一個(gè) ACK??,以便發(fā)送方可以確認(rèn)他發(fā)送的內(nèi)容確實(shí)已收到。我計(jì)劃發(fā)回收到的異或符號(hào)。但是我沒有其他激光二極管用于此目的...
- 信路達(dá) CAN收發(fā)器 XL2515-TSS數(shù)據(jù)手冊(cè)
- 低功耗收發(fā)器MAX490模塊電路圖下載 161次下載
- 硅鍺24GHz收發(fā)器MMICBGT24MTR11數(shù)據(jù)手冊(cè) 27次下載
- RS-232收發(fā)器SP3223E/3243E數(shù)據(jù)手冊(cè) 36次下載
- 單片無線收發(fā)器芯片NRF24L01 PCB原理圖下載 0次下載
- TC32306FTG射頻收發(fā)器數(shù)據(jù)手冊(cè) 32次下載
- 基于RF收發(fā)器的基帶處理器 7次下載
- 2.4GHz無線收發(fā)器IC及其應(yīng)用 29次下載
- FPGA與ADC數(shù)字?jǐn)?shù)據(jù)輸出的接口 96次下載
- 無線射頻收發(fā)器TRF6900A的應(yīng)用研究 151次下載
- 大功率無線數(shù)傳收發(fā)器安裝使用手冊(cè) 85次下載
- 基于MICRF005的高速無線UHF收發(fā)器原理及應(yīng)用
- 高保真數(shù)字無線音頻收發(fā)器產(chǎn)品說明書
- 數(shù)字?jǐn)?shù)據(jù)網(wǎng)
- 計(jì)算機(jī)無線數(shù)據(jù)收發(fā)器電路及制作
- 射頻收發(fā)器是混合集成電路嗎 322次閱讀
- 收發(fā)器的主要作用與種類詳解 2428次閱讀
- 收發(fā)器保護(hù)電路原理圖 747次閱讀
- 適用于數(shù)字混頻器的主要選項(xiàng) 1579次閱讀
- PoE光纖收發(fā)器如何工作,PoE光纖收發(fā)器的應(yīng)用 5256次閱讀
- 光纖收發(fā)器a與b怎么放 3w次閱讀
- 光纖收發(fā)器的效果原理 4229次閱讀
- ADI的最新收發(fā)器產(chǎn)品ADRV9009實(shí)現(xiàn)雜散去相關(guān)的收發(fā)器功能 8709次閱讀
- 數(shù)據(jù)通信與網(wǎng)絡(luò):數(shù)字?jǐn)?shù)據(jù),模擬數(shù)據(jù)和數(shù)字信號(hào)間的轉(zhuǎn)換 1.1w次閱讀
- 數(shù)字擴(kuò)頻收發(fā)器RF109:可將電路復(fù)雜程度和成本降到最低 1381次閱讀
- UAA3545收發(fā)器的應(yīng)用電路 1817次閱讀
- 收發(fā)器SA2421的技術(shù)特點(diǎn)和應(yīng)用電路 1021次閱讀
- 光纖模塊與光纖收發(fā)器使用方法_光纖模塊與光纖收發(fā)器的區(qū)別 2.5w次閱讀
- 基于TDA5255和XC866單片機(jī)的射頻收發(fā)器設(shè)計(jì) 1899次閱讀
- 有關(guān)光纖收發(fā)器的基本常識(shí)解析 1987次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論