資料介紹
描述
?
介紹
在我的數字通信課上,我試圖通過發現領域問題并解決它們來幫助我的學生學習數字通信/計算機網絡。在上一節課中,我們使用激光和 LDR構建了一個摩爾斯電碼發射器/接收器。
今天,我將其擴展到傳輸數字數據;以0和1的流編碼的數據。在摩爾斯電碼中,'dot'和'dash'相當于數字數據的0和1。但是,我們有 0/點的明確信號。沒有信號不被解釋為零。這使得渠道成本更高。我可以達到每分鐘約 18 個單詞(PARIS 通常用作此計算的參考單詞)。這相當于每分鐘 75 個字節或10bps 。
發射機
由于我的發射器是一個具有開和關狀態的激光二極管,關閉狀態可以被認為是 0,而打開狀態可以被認為是 1。然而,這提出了一個挑戰,即如何區分代表數據的一組 0 和0代表靜默(沒有數據傳輸)。
編輯代碼
由于我們遇到了這個問題,我添加了一個開始消息頭/模式 (1011) 和一個結束消息頭/模式 (1101)。我不斷地在我的 LDR 接收器上采樣數據,并將讀取值 0/1 添加到我的數據中。然后,我檢查結束模式,如果找到,我檢查 8 位數據之前的起始標頭。
1011 <8 位數據> 1101
H: 1011010010001101
E: 1011010001011101
L: 1011010011001101
L: 1011010011001101
O: 1011010011111101
我可以在我的接收器上解碼這個模式。
然而,這種封裝消息的簡單模式并非萬無一失。它很容易被流氓數據系列破解。
那么如何驗證接收到的數據是否真的是另一端發送的數據呢?
我在數據末尾添加了一個小簽名;設置位數。由于我的數據是 8 位,我又添加了 4 位來表示可以在數據中設置的最多 8 位。
1011 <8_bit_data><4_sign_bits> 1101
H: 10110100100000101101
E: 10110100010100111101
L: 10110100110000111101
L: 10110100110000111101
O: 10110100111101011101
我也可以解碼這個模式。結果,我可以過濾掉一些垃圾:
我確實有數據丟失,但現在垃圾更少了。那么我該如何進一步改進呢?我可以修復傳輸錯誤嗎?我可以更好地利用符號位嗎?大量可能的改進,但當我們遇到問題并且我們確信該問題值得解決時,我們將解決。可能是下節課……
發射機:
#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;
}
順便說一句,我使用此處發布的最終代碼實現了每秒約 1 字節數據的速度。包括標頭在內,達到每秒 20 位!
編輯
為了檢測數據中的錯誤,我在數據中添加設置位數的簽名機制并沒有被證明是好的。我需要一個不會增加大量數據開銷的更好、更便宜的解決方案。
I XOR 高半字節和低半字節以生成 4 位簽名。此簽名不太可能失敗,因為錯誤(位翻轉)必須發生在高半字節和低半字節的相應位上。
// (sign == (right ^ left))
if(sign == ((data & 0xF) ^ ((data >> 4) & 0xF))){
Serial.print((char)data);
}
正如預期的那樣,結果比以前更好。我很少看到惡意字節通過此測試。
在理想情況下,我不會出錯。我還沒有看到流氓字節,但我確實看到數據包被丟棄了。我如何確保以正確的順序收到所有數據?
這是下一個要解決的問題。為每個數據包構建一個 ACK??,以便發送方可以確認他發送的內容確實已收到。我計劃發回收到的異或符號。但是我沒有其他激光二極管用于此目的...
- 信路達 CAN收發器 XL2515-TSS數據手冊
- 低功耗收發器MAX490模塊電路圖下載 156次下載
- 硅鍺24GHz收發器MMICBGT24MTR11數據手冊 26次下載
- RS-232收發器SP3223E/3243E數據手冊 36次下載
- 單片無線收發器芯片NRF24L01 PCB原理圖下載 0次下載
- TC32306FTG射頻收發器數據手冊 32次下載
- 基于RF收發器的基帶處理器 7次下載
- 2.4GHz無線收發器IC及其應用 29次下載
- FPGA與ADC數字數據輸出的接口 96次下載
- 無線射頻收發器TRF6900A的應用研究 150次下載
- 大功率無線數傳收發器安裝使用手冊 85次下載
- 基于MICRF005的高速無線UHF收發器原理及應用
- 高保真數字無線音頻收發器產品說明書
- 數字數據網
- 計算機無線數據收發器電路及制作
- 收發器的主要作用與種類詳解 1263次閱讀
- 收發器保護電路原理圖 549次閱讀
- 適用于數字混頻器的主要選項 1479次閱讀
- PoE光纖收發器如何工作,PoE光纖收發器的應用 5062次閱讀
- 光纖收發器a與b怎么放 2.9w次閱讀
- 光纖收發器的效果原理 4035次閱讀
- ADI的最新收發器產品ADRV9009實現雜散去相關的收發器功能 8098次閱讀
- 深入探析CAN收發器各項參數 1.4w次閱讀
- 數據通信與網絡:數字數據,模擬數據和數字信號間的轉換 1.1w次閱讀
- 數字擴頻收發器RF109:可將電路復雜程度和成本降到最低 1265次閱讀
- UAA3545收發器的應用電路 1705次閱讀
- 收發器SA2421的技術特點和應用電路 935次閱讀
- 光纖模塊與光纖收發器使用方法_光纖模塊與光纖收發器的區別 2.5w次閱讀
- 基于TDA5255和XC866單片機的射頻收發器設計 1785次閱讀
- 有關光纖收發器的基本常識解析 1943次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多