[国产单片机] 串口的波特率怎么实现自适应?

[复制链接]
3484|11
 楼主| MJM_WSY 发表于 2013-10-26 21:32 | 显示全部楼层 |阅读模式
每次都得设置同样的波特率,很费事,而且板子换了晶振,就得修改程序!怎么去实现波特率自动配置啊?求代码求讲解!我的分少。。。。
谈的元 发表于 2013-10-26 22:50 | 显示全部楼层
本帖最后由 谈的元 于 2013-10-26 22:54 编辑

先设置高频率,串口出错的话,然后降低频率试探,直到正确,

还可以加一个IO口测量电平时间来计算
pattywu 发表于 2013-10-28 08:27 | 显示全部楼层
老鱼探戈 发表于 2013-10-28 16:35 | 显示全部楼层
楼主的意思是系统时钟改变时导致通信双方不匹配
可以通过宏定义固定通信双方的波特率
 楼主| MJM_WSY 发表于 2013-10-28 17:26 | 显示全部楼层
谈的元 发表于 2013-10-26 22:50
先设置高频率,串口出错的话,然后降低频率试探,直到正确,

还可以加一个IO口测量电平时间来计算 ...

我怎么感觉第一个一个一个实验的办法不太靠谱呢?
第二种你有没有实现的代码?
 楼主| MJM_WSY 发表于 2013-10-28 17:26 | 显示全部楼层
pattywu 发表于 2013-10-28 08:27
我的帖子。
    http://www.amobbs.com/thread-5478970-1-1.html

哈哈!你这帖子我看比较靠谱!
 楼主| MJM_WSY 发表于 2013-10-28 17:28 | 显示全部楼层
老鱼探戈 发表于 2013-10-28 16:35
楼主的意思是系统时钟改变时导致通信双方不匹配
可以通过宏定义固定通信双方的波特率 ...

你理解我的意思!但是你的实现方式   有何代码?
老鱼探戈 发表于 2013-10-28 17:44 | 显示全部楼层
MJM_WSY 发表于 2013-10-28 17:28
你理解我的意思!但是你的实现方式   有何代码?

串口的波特率大小,无非就是初值的大小,通过宏定义系统时钟自由选择初始值就可以了。
例如:
  1. //#define        SYS_CLOCK         8000000
  2. #define        SYS_CLOCK         16000000

  3. #if        SYS_CLOCK == 8000000
  4. #define UART_BAUD_RATE                        (65536-(SYS_CLOCK/(32*(UINT32)19200)))  // 19200
  5. #elif        SYS_CLOCK == 16000000
  6. #define UART_BAUD_RATE                        (65536-(SYS_CLOCK/(32*38400)))  // 38400
  7. #elif
  8. #error "BAUD RATE ERROR!"
  9. #endif
这里只用到两种系统时钟,你可以随意发挥。
接下来就是装载初始值了:
  1. RCAP2H = UART_BAUD_RATE>>8 ;
  2.         RCAP2L =UART_BAUD_RATE & 0xff;
  3.         TH2 = UART_BAUD_RATE>>8 ;
  4.         TL2 =UART_BAUD_RATE & 0xff;

谈的元 发表于 2013-10-28 22:43 | 显示全部楼层
MJM_WSY 发表于 2013-10-28 17:26
我怎么感觉第一个一个一个实验的办法不太靠谱呢?
第二种你有没有实现的代码? ...

哪里不靠谱呢?说说看
 楼主| MJM_WSY 发表于 2013-10-29 13:56 | 显示全部楼层
谈的元 发表于 2013-10-28 22:43
哪里不靠谱呢?说说看

我是用单片机给串口发送数据,怎么才能知道有没有发送成功?
谈的元 发表于 2013-10-29 21:16 | 显示全部楼层
本帖最后由 谈的元 于 2013-10-29 21:22 编辑

有接收出错标记
谈的元 发表于 2013-10-29 21:22 | 显示全部楼层
有接收吧,莫非你不接收?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:技术没有制高点

13

主题

367

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部