久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 基于STM32的可見光通信系統(tǒng)程序設(shè)計 [打印本頁]

作者: 747414642    時間: 2020-10-25 14:09
標(biāo)題: 基于STM32的可見光通信系統(tǒng)程序設(shè)計
目前已完成,2m距離,傳輸10000個連續(xù)數(shù)字,每個數(shù)字兩字節(jié)大小,即總共20000個字節(jié)160000bit,用時7s,大約2.3萬bit/s,即22.4kB/s,誤碼率為0






發(fā)射與接收程序:

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #include "sensor.h"
  4. #include "usart.h"
  5. #include "usmart.h"

  6. /*
  7.    程序整體思路:
  8.            ① 把每個要發(fā)射的數(shù)據(jù)轉(zhuǎn)成二進(jìn)制,再將二進(jìn)制的每一位逐1發(fā)射出去;
  9.                  ② 需要3個信號表示一個數(shù)據(jù),分別用高電平持續(xù)的不同時間表示不同
  10.                    信號:起始信號、0信號、1信號,分別對應(yīng)p1,p2,p3;
  11.                  ③ 默認(rèn)狀態(tài)LED是亮的,起始信號發(fā)射的時候,將LED引腳置高,并延遲
  12.                          p1的時間,再進(jìn)行翻轉(zhuǎn),兩次這樣的p1高電平時間即代表起始信號;
  13.                  ④ 數(shù)據(jù)信號需要緊跟著起始信號,一次起始信號之后就是16位的0、1數(shù)
  14.                    據(jù)信號,對于0信號,則是高電平持續(xù)p2時間,再翻轉(zhuǎn),對于1信號,
  15.                          則是高電平持續(xù)p3時間;
  16.                  ⑤ 因此只需要設(shè)置好每個信號之間的時間參數(shù),使用滴答定時器計數(shù)的
  17.                    延遲函數(shù)達(dá)到持續(xù)的效果,然后只要判斷即將發(fā)射的數(shù)據(jù)的各個位,
  18.                          即可將一個數(shù)據(jù)發(fā)射出去。
  19.                         
  20. *        2020.8.30 —— by afeng
  21.     1、優(yōu)化程序,優(yōu)化部分變量,讓程序運行的更快,盡量與接收端同步。

  22. *        2020.8.25 —— by afeng
  23.     1、優(yōu)化發(fā)射端串口助手,使其能夠?qū)崟r自動刷新電腦可用的串口,當(dāng)該串口掉線,則會自動關(guān)閉連接。
  24.                 2、優(yōu)化串口助手的顯示區(qū)域部分,通過設(shè)置光標(biāo)的位置使得文字可以從上至下顯示。

  25. *        2020.8.23 —— by afeng
  26.     1、加入連續(xù)發(fā)射多個數(shù)據(jù)的函數(shù),并支持不同起始數(shù)據(jù)和結(jié)束數(shù)據(jù),然后
  27.                    注冊到USMART調(diào)試組件,以達(dá)到從串口助手來控制發(fā)射的數(shù)據(jù)。
  28.                 2、結(jié)合了自己的基于QT的串口助手,把本工程的USMART組件與該調(diào)試助手
  29.                    結(jié)合起來使用,更方便調(diào)參。

  30. *        2020.8.20 —— by afeng
  31.     1、開始使用USMART調(diào)試組件,可以在串口助手通過函數(shù)帶參數(shù)的方式在線修改
  32.                    各個參數(shù),在后面不同距離下改變參數(shù)有著極大的便利性,免去了重復(fù)修改
  33.                          、編譯和燒錄代碼的繁瑣過程。
  34.           2、解決了二進(jìn)制數(shù)據(jù)位錯誤的BUG,是由于自己不夠熟練位操作引起的,最后
  35.                    決定使用數(shù)字1的移位操作來提取出每個數(shù)據(jù)的各個二進(jìn)制位。
  36.                 3、實現(xiàn)了基于滴答定時器的長時間延遲,由于該定時器只有16位,基于ST庫寫
  37.                    的延遲函數(shù)一次最大不能超過2s,經(jīng)過額外編程實現(xiàn)能夠一次延遲10s以上。
  38.                 4、剔除了每次數(shù)據(jù)都需要結(jié)束信號的方案,使得發(fā)射時間進(jìn)一步提升,其實每
  39.                    個數(shù)據(jù)的起始信號也可以作為每個數(shù)據(jù)的區(qū)分了。
  40.                         
  41. *        2020.8.19 —— by afeng
  42.     1、使用函數(shù)將十進(jìn)制轉(zhuǎn)二進(jìn)制,并能夠?qū)⒚恳粋位通過亮-暗表示0-1將二進(jìn)制
  43.                    各個位成功發(fā)射出去,測得最小時間參數(shù)可以達(dá)到300us左右,但是由于接收
  44.                          端的限制以及距離的影響,這個參數(shù)需要每次調(diào)整。
  45. */


  46. //連續(xù)發(fā)射數(shù)據(jù)
  47. void emitSeriesData(uint16_t start,uint16_t end)
  48. {
  49.         uint16_t i,len=end+1;
  50.         if((start>0) && (end>start))
  51.         {
  52.                 printf("發(fā)送從 %d 到 %d ,共 %d 個數(shù)據(jù)。\r\n",start,end,(end+1-start));
  53.                 printf("正在發(fā)送……\r\n");
  54.                 emitData(start); emitData(end); emitData((end+1-start)); //先發(fā)送本次數(shù)據(jù)塊的信息
  55.                 delay_ms(10);
  56.                 for(i=start;i<len;i++)
  57.                 {
  58.                         emitData(i); //開始循環(huán)發(fā)送,從開始數(shù)據(jù)位開始發(fā)送
  59.                         if(i%100 == 0) printf("%d ",i);
  60.                 }
  61.                 LED = 0;
  62.                 printf("\r\n本次已發(fā)送完成。\r\n");
  63.         }
  64. }

  65. int main(void)
  66. {        
  67.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  68.         uart_init(115200);         //串口初始化為115200
  69.         delay_init();                     //延時函數(shù)初始化         
  70.         LedConfigInit();  //初始化光源引腳及發(fā)射相關(guān)參數(shù)
  71.         usmart_dev.init(SystemCoreClock/1000000); //初始化 USMART,實現(xiàn)在串口修改發(fā)射相關(guān)參數(shù)
  72.         LED = 0;  //發(fā)射前默認(rèn)光源開啟
  73.         printf("當(dāng)前參數(shù):\r\n"); lookUpCurrentParameter();
  74.         printf("\r\n等待發(fā)射數(shù)據(jù)……\r\n");
  75.         emitSeriesData(1,5);
  76.         while(1)
  77.         {
  78.                  //直到等到發(fā)射命令從串口進(jìn)入,才進(jìn)行發(fā)射
  79.                
  80.         }
  81. }
復(fù)制代碼


  1. #define  dataLen 12000
  2. uint16_t dataBuf[dataLen] __attribute__((at(Bank1_SRAM3_ADDR)));
  3. uint16_t dataCurrentPos=0;

  4. int main(void)
  5. {        
  6.         uint16_t recvWorkCounts=0;
  7.         uint8_t j=0,startRecvFlag=0;
  8.         uint16_t i=0,recvData,dataInfo[3]; //dataInfo用來檢驗一次數(shù)據(jù)接收的起始數(shù)據(jù)和結(jié)尾數(shù)據(jù)
  9.         uint16_t errorCounts=0; //用來記錄接收錯誤的數(shù)據(jù)個數(shù)
  10.         uint32_t recvTime_us;  //用來記錄接收用時
  11.         
  12.   delay_init();                     //延時函數(shù)初始化
  13.         uart_init(115200);         //串口初始化為115200
  14.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
  15.         TIM3_CountTime_Init(); //用于計時接收數(shù)據(jù)的時間
  16.   LdrConfigInit();  //初始化光敏傳感器的引腳和輸入捕獲功能
  17.         usmart_dev.init(SystemCoreClock/1000000); //初始化 USMART,實現(xiàn)在串口修改接收相關(guān)參數(shù)
  18.         FSMC_SRAM_Init();                        //初始化外部SRAM
  19.         LCD_Init();

  20.         memset(dataBuf,0,sizeof(dataBuf)); //全都初始化為0
  21.         
  22.         POINT_COLOR=RED;//設(shè)置字體為紅色
  23.         LCD_ShowString(60,50,200,16,16,"My Class Design");        
  24.         LCD_ShowString(60,70,200,16,16,"2020-9-4 @By afeng");        
  25.         LCD_ShowString(60,90,230,16,16,"Visible Light Communication.");
  26.         POINT_COLOR=BLUE;//設(shè)置字體為藍(lán)色
  27.         LCD_ShowString(60,160,200,16,24,"WorkCounts  :");
  28.         LCD_ShowString(60,200,200,16,24,"errorCounts :"); //LCD_ShowNum(230,200,10000,5,24)
  29.         LCD_ShowString(60,240,200,16,24,"usingTime/us:"); //LCD_ShowNum(230,240,200000000,9,24)
  30.         POINT_COLOR=BLACK;
  31.         LCD_ShowNum(230,160,0,9,24);
  32.         LCD_ShowNum(230,200,0,9,24);
  33.         LCD_ShowNum(230,240,0,9,24);
  34.         
  35.         printf("等待接收數(shù)據(jù)……\r\n");
  36.         while(1)
  37.         {
  38.                 recvData = receiveData();  //阻塞等待接收一個數(shù)據(jù)
  39.                
  40.                 if((!startRecvFlag) && recvData)  //先接收起始數(shù)據(jù)和結(jié)束數(shù)據(jù)、及總的長度
  41.                 {
  42.                         dataInfo[j] = recvData;
  43.                         j++;
  44.                         if(j==3)
  45.                         {
  46.                                 j = 0; //若結(jié)束+1-起始 = 長度,則準(zhǔn)備進(jìn)入接收數(shù)據(jù)
  47.                                 if((dataInfo[1]+1-dataInfo[0]) == dataInfo[2]) startRecvFlag = 1;
  48.                                 else printf("此次接收失敗!請重新發(fā)送數(shù)據(jù)!\r\n");
  49.                         }
  50.                 }
  51.                
  52.                 if(startRecvFlag) //開始接收數(shù)據(jù)
  53.                 {
  54.                         printf("receiving...\r\n");
  55.                         startRecvFlag = 0;
  56.                         startCountRunningTime(); //開始計時
  57.                         for(i=dataInfo[0];i<(dataInfo[1]+1);i++) //循環(huán)接收數(shù)據(jù)
  58.                         {
  59.                                 recvData = receiveData();  //阻塞接收
  60.                                 if(recvData==i) dataBuf[dataCurrentPos++] = recvData;
  61.                                 else
  62.                                 {
  63.                                         if(recvData!=0)
  64.                                         {
  65.                                                 dataCurrentPos = recvData-i;
  66.                                                 dataBuf[dataCurrentPos++] = recvData;
  67.                                                 i = recvData;
  68.                                         }
  69.                                 }                                       
  70.                         }
  71.                         recvTime_us = getRunningTime(); //結(jié)束接收計時并得到時間
  72.                         
  73.                         printf("接收完成!正在檢驗數(shù)據(jù)……\r\n");  //檢驗數(shù)據(jù)
  74.                         dataCurrentPos=0;
  75.                         for(i=dataInfo[0];i<(dataInfo[1]+1);i++)
  76.                         {
  77.                                 if(dataBuf[dataCurrentPos]!=i)
  78.                                 {
  79.                                         errorCounts++;
  80.                                         printf("【err】 ");
  81.                                 }
  82.                                 else printf("%d ",dataBuf[dataCurrentPos]);
  83.                                 dataCurrentPos++;
  84.                         }
  85.                         recvWorkCounts++;
  86.                         printf("\r\n");
  87.                         printf("-----------------------------------------------------\r\n");
  88.                         printf("處理完成!  錯誤數(shù)據(jù): %d 個  總接收用時: %d us (%.3f ms  -->  %.2f s)\r\n", \
  89.                         errorCounts,recvTime_us,(recvTime_us/1000.0),(recvTime_us/1000000.0));
  90.                         printf("-----------------------------------------------------\r\n\r\n");
  91.                         LCD_ShowNum(230,200,recvWorkCounts,9,24);
  92.                         LCD_ShowNum(230,200,errorCounts,9,24);
  93.                         LCD_ShowNum(230,240,recvTime_us,9,24);
  94.                         errorCounts = 0;
  95.                         recvData = 0;
  96.                         dataCurrentPos=0;
  97.                         memset(dataBuf,0,sizeof(dataBuf));
  98.                         printf("等待接收數(shù)據(jù)……\r\n");
  99.                 }
  100.         }
  101. }
復(fù)制代碼

原理圖: 無
仿真: 無
代碼: STM32代碼.7z (256.53 KB, 下載次數(shù): 65)


作者: 51hei團(tuán)團(tuán)    時間: 2020-10-26 14:29
好資料,51黑有你更精彩!!!
作者: 郁彼丨北林    時間: 2021-4-9 10:37
問下,有電路原理圖可以看下嗎
作者: 單于鳴晨    時間: 2022-4-8 08:56
請問,有原理圖嗎
作者: haide1998    時間: 2022-9-12 20:49
路過留痕,謝謝分享!
作者: Nomi    時間: 2024-3-19 18:46
可以分享一下電路圖嗎?




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩精品久久久久 | 激情五月婷婷 | 91亚洲国产成人精品性色 | 久久久精品一区二区 | 激情综合婷婷 | 青草视频在线观看免费 | 91福利在线观看 | 91中文| 日本乱轮视频 | 日韩精品视频在线 | 亚洲三级黄色片 | 中文字幕免费观看视频 | 天天躁日日躁狠狠躁伊人 | 黄色天天影视 | 中文av网站| 亚洲视频中文字幕 | 他揉捏她两乳不停呻吟动态图 | 久久成人精品 | 色婷婷婷 | 超碰在线免费播放 | 国产欧美日韩视频 | 亚洲国产日韩在线 | 中文字幕在线观看免费视频 | 中文在线字幕免费观 | 伊人久久久久久久久久 | 欧美日韩高清 | 欧美极品视频 | 激情小说在线视频 | 日韩免费视频一区二区 | 国产精品欧美激情 | 日韩成人在线免费观看 | 精品国产一区二 | 国产男女视频 | 中文字幕网址在线 | 亚洲精品福利视频 | 精品日韩av | 手机看片日韩 | 国产美女一区二区 | 免费网站黄 | 在线观看日韩欧美 | 又大又黄又爽 |