上電第一次通訊時,根據通訊數據幀的第一個固定字節判斷通訊的波特率,程序簡單可靠,已經批量在產品使用,能適應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)
2018-11-26 15:58 上傳
點擊文件名下載附件
|