上电第一次通讯时,根据通讯数据帧的第一个固定字节判断通讯的波特率,程序简单可靠,已经批量在产品使用,能适应1200、2400、4800、9600、19200、115200bps波特率,还可以类推出38400bps、57600bps等常见波特率。可以作为串口波特率自适应程序设计的一个参考。
STM32f103单片机源程序如下:
- #include "main.h"
- #include "xx_Public.h"
- #include "xx_Uart.h"
- #include "xx_StaDetec.h"
- #include "xx_timer.h"
- #include "xx_wdog.h"
- unsigned char SIM1State,SIM2State;
- unsigned char CmdControlByte;//命令控制有关
- unsigned char CmdControlByte2;//命令控制有关
- unsigned char CardReaderStaByte;//卡机状态和模式选择
- unsigned char KeyTimer;//插卡消抖计数
- unsigned int DataTimeOver;//数据包超时时间
- unsigned char MYCHACKCARDSTAT;
- unsigned int LEDTimeCount=500;
- //==========================================
- //EEPROM 参数设置
- //==========================================
- void Save_BTL(u32 addr,unsigned char mydata)
- {
- unsigned char saveData[2];
-
- saveData[0] = mydata;
- saveData[1] = ~mydata;
- Write_STM32Flash(FIRST_ADDR+addr,saveData,2);
- }
- u32 Read_SavedBTL(u32 addr)
- {
- unsigned char *paddr;
- unsigned char saveData[2];
-
-
- paddr = (unsigned char*)(FIRST_ADDR + addr);
-
- saveData[0] = *paddr;
- saveData[1] = *(paddr + 1);
- if((saveData[0] == 30)
- && ((saveData[0] & saveData[1]) == 0)
- && ((saveData[0] | saveData[1]) == 0xFF))
- return 4800;
-
- else if((saveData[0] == 32)
- && ((saveData[0] & saveData[1]) == 0)
- && ((saveData[0] | saveData[1]) == 0xFF))
- return 19200;
-
- else if((saveData[0] == 33)
- && ((saveData[0] & saveData[1]) == 0)
- && ((saveData[0] | saveData[1]) == 0xFF))
- return 38400;
-
- else if((saveData[0] == 34)
- && ((saveData[0] & saveData[1]) == 0)
- && ((saveData[0] | saveData[1]) == 0xFF))
- return 57600;
-
- else if((saveData[0] == 35)
- && ((saveData[0] & saveData[1]) == 0)
- && ((saveData[0] | saveData[1]) == 0xFF))
- return 115200;
-
- else return 115200;
- }
- void GetxxVersion(unsigned char cm,unsigned char pm1,unsigned char pm2)
- {
- unsigned char version[14] = {"xxxxx V4.133 T"};
- if(pm1 == 0x33)//内部版本号
- {
- ReturnToHost(RETURN_NO_STA,cm,pm1,pm2,SUCCESSED,version,14);
- }
- else ReturnToHost(RETURN_NO_STA,cm,pm1,pm2,SUCCESSED,version,12);
- }
- //=========命令解析及分发====================
- void MainEventDeal(void)
- {
- //u32 temp;
- unsigned char returnData[20];
- unsigned char receiveData[260];
- unsigned char cm,pm1,pm2,pm3,returnSta;
- unsigned int receiveLen,sentLen,len,i;
-
- cm = RxDataBuffer[3];
- pm1= RxDataBuffer[4];
- pm2 = RxDataBuffer[5];
- pm3 = RxDataBuffer[6];
- len = (unsigned int)(RxDataBuffer[1] * 256 +RxDataBuffer[2]);
- receiveLen = len -2;
- for(i = 0;i < receiveLen;i++)
- receiveData[i] = RxDataBuffer[5 + i];
- sentLen = 0;
- switch(cm)
- {
- case GET_MT_VER://cm2:30 外部版本 31内部版本
- GetxxVersion(cm,pm1,pm2);
- break;
- case SETBTL://设置波特率
- returnSta = SUCCESSED;
- switch(pm1)
- {
- case SETBTL_4800:
- Save_BTL(PARAM_BTL_ADDR,30);
- break;
-
- case SETBTL_9600:
- Save_BTL(PARAM_BTL_ADDR,31);
- break;
-
- case SETBTL_19200:
- Save_BTL(PARAM_BTL_ADDR,32);
- break;
-
- case SETBTL_38400:
- Save_BTL(PARAM_BTL_ADDR,33);
- break;
- case SETBTL_57600:
- Save_BTL(PARAM_BTL_ADDR,34);
- break;
-
- case SETBTL_115200:
- Save_BTL(PARAM_BTL_ADDR,35);
- break;
-
- default:
- returnSta = PMERR;
- break;
- }
- ReturnToHost(ReturnNoPM2,cm,pm1,pm2,returnSta,returnData,sentLen);
- break;
-
- default:
- ReturnToHost(ReturnNoPM2,cm,pm1,pm2,CMERR,returnData,sentLen);
- break;
- }
- }
- void SystemIni(void)
- {
- S_Systimer_init();
- //设置串口接收脚为外部中断,设置计时的定时器
- S_UsartRxPinSetExInt(USART1);
-
- S_LEDInit();//指示灯
- }
- //=========变量初始化=================
- void IniVariable(void)
- {
- DataTimeOver = 0;
- MYCHACKCARDSTAT = 1;//0x30;
- }
- void delay(unsigned int itimer)
- {
- while(itimer--)
- {
- __NOP();
- }
- }
- //==========主函数=====================
- int main(void)
- {
- unsigned char data1,data2,i;
- unsigned int lenmag = 0;
-
- delay(1000);
- STM32MCUIni();
- SystemIni();
- IniVariable();
- TIM_Delayms(20);//延时20ms
- while(1)
- {
- if(UARTSET.type == 0)//
- UART_Baudset();
- else
- {
- UartDataAnaly();
- if(Test_CommandOkFlag)
- {
- MainEventDeal();
- Res_CommandOkFlag;
- }
- }
- }
- }
复制代码
所有资料51hei提供下载:
baudselfadaption.rar
(520.84 KB, 下载次数: 47)
|