7113|6

81

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【UART1】如何收到完整的内容后再发送数据 [复制链接]



最近在用STM8s103进行串口通讯调试。
使用UART1,利用中断进行收发,主要代码(中断处理部分)如下
  1. /*发送中断处理代码*/
  2. @interrupt void USART_TX(void)
  3. {
  4.     /* 将一个字节写入发送寄存器,并将发送缓冲区指针向后移动一个字节*/
  5.     /*TxBuffer是定义的8字节的字符串,TxCounter是定义的无符号字符变量,用来计数*/
  6.     UART1->DR = TxBuffer[TxCounter++];
  7.     /*如果发送的字节数等于发送缓冲区长度(8字节)*/
  8.     /*BufferSize是常量8*/
  9.     if (TxCounter == BufferSize)
  10.     {
  11.          /* 禁止发送中断 */
  12.          UART1->CR2 &= (~UART1_CR2_TIEN);
  13.          TxCounter = 0;
  14.     }
  15.     return;
  16. }
  17. /*接收中断处理代码*/
  18. @interrupt void USART_RX(void)
  19. {
  20.     u8 dummy = UART1->SR;
  21.     /*如果状态寄存器标识了接收寄存器中有数据,且接收数据长度小于指定长度*/
  22.     if ( (dummy & 0x20) && (RxCounter < BufferSize) )
  23.     {
  24.      /* 从接收数据寄存器中读取一个字节 */
  25.      RxBuffer[RxCounter++] = UART1->DR;
  26.     }
  27.     else
  28.     {
  29.          if (RxCounter == BufferSize)
  30.          {
  31.              /*当接收的数据长度符合要求时,使能发送中断,进行数据发送*/
  32.              UART1->CR2 |= UART1_CR2_TIEN;
  33.          }
  34.          RxCounter = 0;
  35.         /*禁止接收中断*/
  36.         //UART1->CR2 &= (~UART1_CR2_RIEN);
  37.     }
  38.     return;
  39. }
复制代码
预期目的:
    MCU作为下位机,由电脑(作为主机)串口发送数据给MCU。只要MCU的UART1接收到完整的数据(比如8个字节)后,立即从UART1返回数据(也是8个字节)给发送者,未收到数据时或接收数据不完整均不发送任何数据。主机数据不是连续发送的,但这一帧数据(8个字节)是连续发送的。MCU要侦测是否是完整帧,不是完整帧就丢弃。
问题:
    如何保持接收寄存器处于待命状态,等待主机发送指令,为何程序中的dummy&0x20一直有信号,根据STM8s控制器参考手册中说明,读取状态寄存器后再读取接收数据寄存器状态寄存器中的RXNE应该为0,即读取完指定长度的数据后,该位不应该再为1,接收中断处于待命状态,MCU也不会主动发送任何数据.
    实际情况:从复位开始要接收到9个字节后才能返回数据,以后每收到1个字节就返回发送缓冲区的所有字节。
备注:
主程序在初始化时完成后,打开了接收中断。
有谁有好的方法达到预期目的吗?还请不吝赐教。
此帖出自stm32/stm8论坛

最新回复

                                 建议楼主演习一下状态机。不然稍微复杂一点就死定了。  详情 回复 发表于 2009-12-3 15:24
点赞 关注
 

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
程序逻辑有问题!

当(dummy & 0x20)!=0 并且 RxCounter >= BufferSize 时,没有读DR,接收标记不能被清除。
此帖出自stm32/stm8论坛
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
程序逻辑有问题!

当(dummy & 0x20)!=0 并且 RxCounter >= BufferSize 时,没有读DR,接收标记不能被清除。
又试过读取DR,问题依旧。
此帖出自stm32/stm8论坛
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
请你改成这样的结构:

if  (dummy & 0x20)
     /* 从接收数据寄存器中读取一个字节 */
     RxBuffer[RxCounter++] = UART1->DR;

if (RxCounter >= BufferSize)
   ......
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
                                 这是因为你一直没有停止发送。
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
经过这几天的琢磨,终于搞定了。结贴。
ST啊,真折磨人。
连例子程序都没讲清楚串口的使用,还让大家用,晕~~~~~
此帖出自stm32/stm8论坛
 
 
 

回复

66

帖子

1

TA的资源

一粒金砂(初级)

7
 
                                 建议楼主演习一下状态机。不然稍微复杂一点就死定了。
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表