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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3697|回復: 0
收起左側

STM32f103串口自適應程序,批量驗證過,源代碼簡單可靠

[復制鏈接]
ID:433446 發表于 2018-11-26 16:03 | 顯示全部樓層 |閱讀模式
上電第一次通訊時,根據通訊數據幀的第一個固定字節判斷通訊的波特率,程序簡單可靠,已經批量在產品使用,能適應1200、2400、4800、9600、19200、115200bps波特率,還可以類推出38400bps、57600bps等常見波特率。可以作為串口波特率自適應程序設計的一個參考。
0.png

STM32f103單片機源程序如下:
  1. #include "main.h"
  2. #include "xx_Public.h"
  3. #include "xx_Uart.h"
  4. #include "xx_StaDetec.h"
  5. #include "xx_timer.h"
  6. #include "xx_wdog.h"


  7. unsigned char SIM1State,SIM2State;
  8. unsigned char CmdControlByte;//命令控制有關
  9. unsigned char CmdControlByte2;//命令控制有關
  10. unsigned char CardReaderStaByte;//卡機狀態和模式選擇

  11. unsigned char KeyTimer;//插卡消抖計數
  12. unsigned int DataTimeOver;//數據包超時時間
  13. unsigned char MYCHACKCARDSTAT;
  14. unsigned int LEDTimeCount=500;

  15. //==========================================
  16. //EEPROM 參數設置
  17. //==========================================
  18. void  Save_BTL(u32 addr,unsigned char mydata)
  19. {
  20.         unsigned char saveData[2];

  21.         
  22.         saveData[0] = mydata;
  23.         saveData[1] = ~mydata;
  24.         Write_STM32Flash(FIRST_ADDR+addr,saveData,2);
  25. }

  26. u32  Read_SavedBTL(u32 addr)
  27. {
  28.         unsigned char *paddr;
  29.         unsigned char saveData[2];
  30.         
  31.         
  32.         paddr = (unsigned char*)(FIRST_ADDR + addr);
  33.         
  34.         saveData[0] = *paddr;
  35.         saveData[1] = *(paddr + 1);

  36.         if((saveData[0] == 30)
  37.                 && ((saveData[0] & saveData[1]) == 0)
  38.                 && ((saveData[0] | saveData[1]) == 0xFF))
  39.                 return 4800;
  40.         
  41.         else if((saveData[0] == 32)
  42.                 && ((saveData[0] & saveData[1]) == 0)
  43.                 && ((saveData[0] | saveData[1]) == 0xFF))
  44.                 return 19200;
  45.         
  46.         else if((saveData[0] == 33)
  47.                 && ((saveData[0] & saveData[1]) == 0)
  48.                 && ((saveData[0] | saveData[1]) == 0xFF))
  49.                 return 38400;
  50.         
  51.         else if((saveData[0] == 34)
  52.                 && ((saveData[0] & saveData[1]) == 0)
  53.                 && ((saveData[0] | saveData[1]) == 0xFF))
  54.                 return 57600;
  55.         
  56.         else if((saveData[0] == 35)
  57.                 && ((saveData[0] & saveData[1]) == 0)
  58.                 && ((saveData[0] | saveData[1]) == 0xFF))
  59.                 return 115200;
  60.         
  61.         else return 115200;
  62. }

  63. void GetxxVersion(unsigned char cm,unsigned char pm1,unsigned char pm2)
  64. {
  65.         unsigned char version[14] = {"xxxxx V4.133 T"};

  66.         if(pm1 == 0x33)//內部版本號
  67.         {
  68.                 ReturnToHost(RETURN_NO_STA,cm,pm1,pm2,SUCCESSED,version,14);
  69.         }
  70.         else ReturnToHost(RETURN_NO_STA,cm,pm1,pm2,SUCCESSED,version,12);
  71. }

  72. //=========命令解析及分發====================
  73. void MainEventDeal(void)
  74. {
  75.         //u32 temp;
  76.         unsigned char returnData[20];
  77.         unsigned char receiveData[260];
  78.         unsigned char cm,pm1,pm2,pm3,returnSta;
  79.         unsigned int receiveLen,sentLen,len,i;
  80.         

  81.         cm = RxDataBuffer[3];
  82.         pm1= RxDataBuffer[4];
  83.         pm2 = RxDataBuffer[5];
  84.         pm3 = RxDataBuffer[6];
  85.         len = (unsigned int)(RxDataBuffer[1] * 256 +RxDataBuffer[2]);
  86.         receiveLen = len -2;
  87.         for(i = 0;i < receiveLen;i++)
  88.                 receiveData[i] = RxDataBuffer[5 + i];
  89.         sentLen = 0;


  90.         switch(cm)
  91.         {
  92.                 case GET_MT_VER://cm2:30 外部版本  31內部版本
  93.                         GetxxVersion(cm,pm1,pm2);
  94.                         break;        

  95.                 case SETBTL://設置波特率
  96.                         returnSta = SUCCESSED;
  97.                         switch(pm1)
  98.                         {
  99.                                 case SETBTL_4800:
  100.                                         Save_BTL(PARAM_BTL_ADDR,30);
  101.                                         break;        
  102.                                        
  103.                                 case SETBTL_9600:
  104.                                         Save_BTL(PARAM_BTL_ADDR,31);
  105.                                         break;
  106.                                        
  107.                                 case SETBTL_19200:
  108.                                         Save_BTL(PARAM_BTL_ADDR,32);
  109.                                         break;
  110.                                        
  111.                                 case SETBTL_38400:
  112.                                         Save_BTL(PARAM_BTL_ADDR,33);
  113.                                         break;

  114.                                 case SETBTL_57600:
  115.                                         Save_BTL(PARAM_BTL_ADDR,34);
  116.                                         break;
  117.                                        
  118.                                 case SETBTL_115200:
  119.                                         Save_BTL(PARAM_BTL_ADDR,35);
  120.                                         break;
  121.                                        
  122.                                 default:
  123.                                         returnSta = PMERR;
  124.                                         break;
  125.                         }
  126.                         ReturnToHost(ReturnNoPM2,cm,pm1,pm2,returnSta,returnData,sentLen);
  127.                         break;
  128.                
  129.                 default:        
  130.                         ReturnToHost(ReturnNoPM2,cm,pm1,pm2,CMERR,returnData,sentLen);
  131.                         break;
  132.         }
  133. }

  134. void SystemIni(void)
  135. {
  136.         S_Systimer_init();

  137.         //設置串口接收腳為外部中斷,設置計時的定時器
  138.         S_UsartRxPinSetExInt(USART1);
  139.         
  140.         S_LEDInit();//指示燈
  141. }
  142. //=========變量初始化=================
  143. void IniVariable(void)
  144. {
  145.         DataTimeOver = 0;
  146.         MYCHACKCARDSTAT = 1;//0x30;
  147. }

  148. void delay(unsigned int itimer)
  149. {
  150.         while(itimer--)
  151.         {
  152.                 __NOP();
  153.         }
  154. }

  155. //==========主函數=====================
  156. int main(void)
  157. {
  158.         unsigned char data1,data2,i;
  159.         unsigned int lenmag = 0;
  160.         
  161.         delay(1000);
  162.         STM32MCUIni();
  163.         SystemIni();
  164.         IniVariable();
  165.         TIM_Delayms(20);//延時20ms

  166.         while(1)
  167.           {
  168.                   if(UARTSET.type == 0)//
  169.                           UART_Baudset();
  170.                   else
  171.                 {
  172.                           UartDataAnaly();
  173.                         if(Test_CommandOkFlag)
  174.                         {
  175.                                 MainEventDeal();
  176.                                 Res_CommandOkFlag;
  177.                         }
  178.                 }
  179.           }
  180. }
復制代碼

所有資料51hei提供下載:
baudselfadaption.rar (520.84 KB, 下載次數: 47)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区av | 久久精品一 | 小视频你懂得 | 久草视频观看 | 国产精品观看 | 欧美日韩中文国产一区发布 | 中文字幕一级毛片 | 日韩欧美三区 | 国产高清视频一区 | 久久精品国产免费一区二区三区 | 欧美精品在欧美一区二区 | 日韩在线国产精品 | 色毛片| 91五月天| 天堂中文在线播放 | 日本在线黄色 | 国产高清在线观看 | 在线亚洲欧美 | 亚洲精品免费在线观看 | 高清黄色 | 亚洲一区二区在线视频 | 伊人激情综合网 | 欧美一a一片一级一片 | 国产福利在线视频 | 久久午夜视频 | 日韩一区二区三区在线 | 精品一二区 | 视频一区二区中文字幕 | 玖玖视频网 | 国产亚洲精品精品国产亚洲综合 | 中文字幕在线观看国产 | 一级大黄 | 综合天天久久 | 91欧美激情一区二区三区成人 | 国产精品不卡视频 | 超碰在线网站 | 中文字幕免费 | 亚洲欧美一区二区三区在线 | 狠狠色香婷婷久久亚洲精品 | 日韩在线免费 | 久久国产欧美日韩精品 |