发新帖我要提问
12
返回列表
打印

stm32的Usart收发数据,485

[复制链接]
楼主: 759612761
手机看帖
扫描二维码
随时随地手机跟帖
21
759612761|  楼主 | 2011-7-26 16:53 | 只看该作者 回帖奖励 |倒序浏览
while(1)
  {
    GPIO_ResetBits(GPIOA, GPIO_Pin_11); //置低允许接受
    RX_status = USART_GetFlagStatus(USART2, USART_FLAG_RXNE);
    if(RX_status != RESET)
    {
      j = USART_ReceiveData(USART2);
        if(j == 0x41) GPIO_SetBits(GPIOB, GPIO_Pin_0);  // 测试接受到的数据确实是上位机发送的数据
      GPIO_SetBits(GPIOA, GPIO_Pin_11);  //置高允许发送
      USART_SendData(USART2, j);
      while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
      GPIO_ResetBits(GPIOA, GPIO_Pin_11);
      
      GPIO_ResetBits(GPIOB, GPIO_Pin_0);
    }
程序很简单,就是接收------>发送

使用特权

评论回复
22
759612761|  楼主 | 2011-7-26 17:01 | 只看该作者
while(1)
  {
    GPIO_ResetBits(GPIOA, GPIO_Pin_11); //允许接受
    RX_status = USART_GetFlagStatus(USART2, USART_FLAG_RXNE);
    if(RX_status != RESET)
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_0);
      j = USART_ReceiveData(USART2);
        if(j == 0x41)  GPIO_SetBits(GPIOB, GPIO_Pin_0);//接收到的数据确定是上位机发送的数据(A,然后灯亮)
        Delay(10);  //延时
      GPIO_SetBits(GPIOA, GPIO_Pin_11);
      USART_SendData(USART2, j);
      while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
      GPIO_ResetBits(GPIOA, GPIO_Pin_11);
      
      GPIO_ResetBits(GPIOB, GPIO_Pin_0);   //灯灭
    }
延时后,还是不可以

使用特权

评论回复
23
xm042041| | 2011-7-26 17:01 | 只看该作者
发送用函数,接收用中断,如果接收用查询也应该用while函数啊,个人看法

使用特权

评论回复
24
759612761|  楼主 | 2011-7-27 10:34 | 只看该作者
在485的A,B两个引脚上加上0.1uF的电容后,上位机向单片机发送数据,单片机不上电也会向上位机返回数据,只不过不是正确的数据,请问有谁知道用485通讯时的硬件电路应该注意什么

使用特权

评论回复
25
yhn1973| | 2011-7-27 15:19 | 只看该作者
接收引脚RXD上加10K上拉电阻。

使用特权

评论回复
26
lixiaoxu2meng| | 2011-7-27 16:15 | 只看该作者
电路图

未命名.JPG (139.06 KB )

未命名.JPG

使用特权

评论回复
27
759612761|  楼主 | 2011-7-27 19:46 | 只看该作者
电路基本没做修改,我对程序做了一下修改(使用的是中断):
void USART2_IRQHandler(void)
{
  //接收中断
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  {
    QueueWrite((void *)RxBuffer, USART_ReceiveData(USART2));
    Delay(100);  //延时
    USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  }

  if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
  {   
    if(QUEUE_OK == QueueRead(&TxChar_1, (void *)RxBuffer))
    {
      GPIO_SetBits(GPIOA, GPIO_Pin_11);
      USART_SendData(USART2, TxChar_1);
      while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
      {
      }
     Delay(100);    //延时
      GPIO_ResetBits(GPIOA, GPIO_Pin_11);
    }
    else
    {
       USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
    }
  }
}
上面加了两处延时,可以向上位机接收数据并且发送倒是上位机,但是当上位机向单片机发送数据一次超过两个时就会出现错误

使用特权

评论回复
28
china_fog| | 2011-7-27 22:17 | 只看该作者
20楼说的没错

使用特权

评论回复
29
lixiaoxu2meng| | 2011-7-28 09:13 | 只看该作者
怎么能在中断里用延时呢
main()
{
  //初始化
while(1)
{
  if(ID == 1)
{
ID = 0;
  //485发送使能
//延时
USART_SendData(USART2, Recive);
//发送完毕后将48/5设置为接受使能
}
}
}
void USART2_IRQHandler(void)
{
   if( USART_GetITStatus(USART2, USART_IT_RXNE) == SET )        //接收中断
  {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
   
    Recive= USART_ReceiveData(USART2);//接收一字节数据
ID = 1;

}
}

使用特权

评论回复
30
lixiaoxu2meng| | 2011-7-28 09:13 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-7-28 09:15 编辑

怎么能在中断里用延时呢
main()
{
  //初始化
while(1)
{
  if(ID == 1)
{
ID = 0;
  //485发送使能
//延时
USART_SendData(USART2, Recive);
//发送完毕后将48/5设置为接受使能
}
}
}
void USART2_IRQHandler(void)
{
   if( USART_GetITStatus(USART2, USART_IT_RXNE) == SET )        //接收中断
  {
    USART_ClearITPendingBit(USART2, USART_IT_RXNE);
   
    Recive= USART_ReceiveData(USART2);//接收一字节数据
ID = 1;
}
}

使用特权

评论回复
31
chunyang| | 2011-7-28 23:56 | 只看该作者
在485的A,B两个引脚上加上0.1uF的电容后,上位机向单片机发送数据,单片机不上电也会向上位机返回数据,只不过不是正确的数据,请问有谁知道用485通讯时的硬件电路应该注意什么 ...
759612761 发表于 2011-7-27 10:34


485总线上不能接电容,静态时总线逻辑应该为1。

使用特权

评论回复
32
香水城| | 2011-7-29 13:20 | 只看该作者
请注意USART_FLAG_TXE标志不表示发送结束,只表示发送缓冲区空,USART_FLAG_TC标志才表示发送结束。

使用特权

评论回复
33
lixiaoxu2meng| | 2011-7-29 14:38 | 只看该作者
刚编写的例子

project.rar

503.48 KB

使用特权

评论回复
34
759612761|  楼主 | 2011-7-29 14:47 | 只看该作者
33# lixiaoxu2meng
谢谢了,先研究一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则