OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12936|回复: 4

RS485查询发送方式输出乱码

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-3-28
在线时间
0 小时
发表于 2012-3-28 10:33:32 | 显示全部楼层 |阅读模式

RS485查询发送方式输出乱码,用库函数的输出正常,说明硬件没什么问题,配置就RCC配置和GPIO口配置,其他都没有用到,
不知道到底什么原因,还请前辈们帮忙看下,多谢~~
int main(void)
{   
 Stm32_Clock_Init(9); //系统时钟设置
// delay_init(72);      //延时初始化
 uart_init(72,9600);  //串口初始化为9600
// LED_Init();      //初始化与LED连接的硬件接口  
  //清除TC标志 否则总丢失第一个字符
  USART2->SR&=0XBF;

  while(NbrOfDataToTransfer--)

  {
     GPIOF->ODR |=1<<11; // 使能发信号
    // USART_SendData(USART2,TxBuffer[TxCounter]);
 // TxCounter++;
  USART2->DR=TxBuffer[TxCounter++];
  //总是丢失第一个字符,这个问题的根本原因是复位后,TC和TXE标志位默认都是1;
  //while在发送第一个字节时没有起到应有作用,直接跳出,接着写第二个字节,这时第一个字节还未发出,数据被破坏了
  while((USART2->SR&0X40)==0);//等待发送结束 
   printf("\r\nSuccess of displaying\r\n"); ////
   //delay_ms(100);

   }
 }

void uart_init(u32 pclk2,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟
 RCC->APB2ENR|=1<<7;   //使能PORTF口时钟
 RCC->APB1ENR|=1<<17;  //使能UART2时钟

 GPIOA->CRL&=0XFFFFF0FF;
 GPIOA->CRL|=0X00000B00;//PA2 推挽复用   UART2_TX alternate function push-pull 

 GPIOA->CRL&=0XFFFF0FFF;
 GPIOA->CRL|=0X00004000;//PA3: UART2_RX input floating 
 
    //接收、发送方向控制 
 GPIOF->CRH&=0XFFFF0FFF;
 GPIOF->CRH|=0X00003000;//PF11 推挽输出    
    GPIOF->ODR|=0<<11;      //PF11 输出高 发送模式
   
 RCC->APB1RSTR|=1<<17;   //复位串口2
 RCC->APB1RSTR&=~(1<<17);//停止复位      
 //波特率设置
  USART2->BRR=mantissa; // 波特率设置 
 USART2->CR1|=0X200C;  //USART2使能  使能发送接收
 USART2->CR1&=0XEBFF;//1个起始位、8个数据位、n个位停止、无校验
 USART2->CR2&=0XCFFF;   // 1个停止位
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-3-28
在线时间
0 小时
 楼主| 发表于 2012-3-28 10:42:03 | 显示全部楼层
试了多个波特率都不行
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-28 10:58:15 | 显示全部楼层
485和232一个样,只是变成半双工了。你用232的方式检测一下,就可以确定问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-3-28
在线时间
0 小时
 楼主| 发表于 2012-3-28 11:08:33 | 显示全部楼层
我在库函数版的程序上慢慢改动
发现改动到波特率这块输出才是乱码
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分  
    mantissa<<=4;
 mantissa+=fraction; 
应该是这块的问题
uart_init(72,9600);  //串口初始化为9600
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2012-3-28
在线时间
0 小时
 楼主| 发表于 2012-3-28 11:15:04 | 显示全部楼层
问题解决
APB1=DIV2;
uart_init(36,9600);  //波特率设置成功
谢谢原子解答
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 07:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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