发一个自适应波特率的程序,看有没有人感兴趣

2020-02-02 09:20发布

搜了下好像坛子里还没人玩这个,个人觉得很有用,特别是产品比较开放的时候可以自动调节波特率,而且也不用愁晶振更换的问题了(例如12M、14M、10M都无所谓..)

点击此处下载 ourdev_630154BNSSDG.doc(文件大小:118K) (原文件名:单片机从机的波特率自适应设置.doc)

原理是测起始位宽度(第一位),并以此为标准设置波特率,呵呵,不是很难哈



(原文件名:串口 TTL电平规范,发送01 s所以低位在前.JPG)


(原文件名:串口 TTL电平规范,发送55.JPG)

注:此办法需要主机发送一个标准信号,例如01H,

我在想一个更好办法,就是多次捕获脉宽,然后取最小值(1B),然后平均~,应该也能实现~~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
64条回答
GZLJZ
1楼-- · 2020-02-04 18:29
 精彩回答 2  元偷偷看……
fy024
2楼-- · 2020-02-05 00:04
回复【16楼】Ian11122840 船儿舟
点击此处下载  (原文件名:msp430uart串口波特率自动检.pdf)  
又找到一篇自适应波特率的办法,这个办法是用的发送od,看它收到什么


(原文件名:未命名.jpg)
引用图片


(原文件名:未命名.jpg)
<center><a class=tt16 onclick="fnquic......
-----------------------------------------------------------------------

这个方法好,以前只是想到了测量脉宽的方法~~~~~~
lm78l05
3楼-- · 2020-02-05 05:58
mark
ssaweee
4楼-- · 2020-02-05 10:41
很多芯片本身就能自适应波特率。
Ian11122840
5楼-- · 2020-02-05 10:53
继续发!把Timer2做成72M的捕获,

以9600波特率发送数据,捕获存储,得到数组ary!
void Auto_baud(void)
{        u16 i;                         
        const u16 tmplen=100;//捕获个数
        u16 ary[tmplen];         //捕获数组

        TIM_TimeBaseInitTypeDef          TIM_TimeBaseStructure;       

//Timer2--72M: 时基减得cap
         TIM_DeInit(TIM2);//复位TIM2定时器                 
         TIM_TimeBaseStructure.TIM_Period = 65535;                 //计数值max65535     
         TIM_TimeBaseStructure.TIM_Prescaler = 0;                //NO分频72M   
         TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; // 时钟分割  
         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数
         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

         TIM_Cmd(TIM2, ENABLE);        //开启时钟       

////////////
         while(U3RX==1)TIM2->CNT = 0;          //等第一个下降沿
         while(U3RX==0)TIM2->CNT = 0;          //等第一个下降沿
         while(U3RX==1)TIM2->CNT = 0;          //等第一个下降沿
         for(i=0;i<tmplen;i++){

                 while(U3RX==0);
               
                 ary = TIM2->CNT;
                 
                  while(U3RX==1)TIM2->CNT = 0;
                 }

         //发回数组
                 for(i=0;i<tmplen;i++){
                 printf("%d,",ary);
                 }



数组里的数据如下:
984,14998,7702,22662,7686,37638,7702,7702,14982,14982,7686,7702,7686,7702,14998,7702,7686,29958,7686,22678,7318,14982,7702,22662,14982,7686,14982,14982,37638,14982,29958,14982,7702,7702,7686,14982,7702,7702,7702,14998,14982,7302,14982,37654,14998,37638,14998,37638,14982,22662,7302,14982,7686,37638,7686,22678,7318,14982,14982,14982,14982,29958,14982,7702,7702,7686,14982,7702,7686,14982,14982,7302,14982,22662,7686,14982,7686,22662,14998,22662,7686,14998,7686,7702,14998,22662,7302,14982,14998,14998,7702,22662,7302,14982,7702,22678,14998,7686,22662,14998,


9600波特率,对于Timer2的捕获值理论是7494.543972
可以看出,基本上捕获的都是这个的整数倍~~~~~

现在问题是,如何根据捕获数组求得最小公约数值~~
Ian11122840
6楼-- · 2020-02-05 11:36
 精彩回答 2  元偷偷看……

一周热门 更多>