找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3238|回复: 0
打印 上一主题 下一主题
收起左侧

STM32f103串口自适应程序,批量验证过,源代码简单可靠

[复制链接]
跳转到指定楼层
楼主
上电第一次通讯时,根据通讯数据帧的第一个固定字节判断通讯的波特率,程序简单可靠,已经批量在产品使用,能适应1200、2400、4800、9600、19200、115200bps波特率,还可以类推出38400bps、57600bps等常见波特率。可以作为串口波特率自适应程序设计的一个参考。


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)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表