6032|11

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口接收数据有问题,接收到了数据,却在不断查询 [复制链接]

我用的单片机是TMP19A61,用C写的。这款单片机的发送buf和接收buf共用一个寄存器。我目前采用查询方式来收发数据。用回环(将TX和RX引脚用一根导线接一起)来测试。我没有用FIFO,而是用double buffer.

接收函数的大概步骤是:
1.查询buf是否有数据(查询状态寄存器中的某位)
2.读取buf寄存器的值

问题是:通过调试器看到明明已经正确接收到数据了,buf寄存器有值了,值也是对的,可是为什么程序却始终都停在查询buf是否有数据这条语句?

大概情况是:
1.因为采用的是回环,我发一个数据,然后马上就接收到一个数据,很奇怪的是:我通过调试窗口都看到接收buf寄存器有值了,并且值是对的,就是我发送的值,可是程序却始终都停在查询buf是否有数据这条语句,搞不懂-------单步执行会这样;换成全速执行,则OK,没有问题。
2.我用串口调试助手测过了,PC发,uart接;uart发,PC接都是对的,可是用回环测为什么不对?
3.我有同事在做USB,USB芯片是CH375,通过串口连接。往CH375发送命令,CH375会返回数据,因为用的是我的UART驱动,结果接收buf接收到的数据是对的,可是程序一直停在查询buf是否有数据这条语句,不管单步还是全速都不行


最新回复

然后,调试的时候,这些读了会清0的寄存器,不要让它出现在WATCH窗口中,以免干扰  详情 回复 发表于 2010-2-4 15:55
点赞 关注

回复
举报

85

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
状态寄存器被的调试工具读了(读了就会自动清0的寄存器),于是你的程序无法正确运行
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
谢谢!确实如你所说:这个状态寄存器是当接收到的数据从receive shift register移至receive double buffer时,该位置1;而读取该位会导致该位清0.

单步---状态寄存器被的调试工具读了,全速应该不会把
可是为什么我的同事做USB驱动,用我UART驱动往CH375里面发命令,然后接收从CH375返回的数据,用的是全速,还是会停在查询buf是否有数据这条语句?
 
 
 

回复

103

帖子

0

TA的资源

一粒金砂(初级)

4
 
一般来说,全速运行时调试工具不会造成干扰.

CH375的问题我猜不出是为什么. 你提供的信息太少了.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
楼主你说的“程序一直停在查询buf是否有数据这条语句”是什么意思?是你点停止的时候停在这一句??

只要能接收正确就行了,也许你这一直在查询,一点停止就停止在这个地方也没什么问题啊。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

6
 
是程序一直在跑,但是一直停在查询buf是否有数据(查询状态寄存器中的某位)这句话,而跳不到下一句话
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
但是一直停在查询buf是否有数据

就是说比如--  while(sflag==0);  但是sflag始终不等于1是吧,楼主贴上那句代码啊。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

8
 
恩,建议楼主贴上代码看看。
如果你是用while循环的话,处理不当的可能会有一些问题。程序一直没空跳出来。一直再查询。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

9
 
unsigned char UART_RecvByte(void)                                //接收一字节
{ unsigned char a_temp;
  while(!(IO_SC6MOD2&0x40));                       //查询方式,等待,直到接收buf中有数据
  a_temp =IO_SC6BUF;
  return a_temp;                             //直接读取SC6BUF寄存器,即可获得接收到的数据
}

寄存器SC6MOD2【7:0】 第6位--0:receive buffer empty  1: receive buffer full
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

10
 
程序会一直停在while(!(IO_SC6MOD2&0x40));这句话,
可是从调试窗口可以看到IO_SC6BUF寄存器已经正确接收到数据.

因为USB驱动也要用到UART,USB芯片是CH375,通过串口连接。往CH375发送命令,CH375会返回数据,因为用的是我的UART驱动,结果接收buf接收到的数据是对的,可程序却一直停在while(!(IO_SC6MOD2&0x40))这句话,不管单步还是全速都不行

我刚做驱动,搞不清这些奇怪的问题,麻烦各位继续指点下,谢谢啦!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
不清楚你的IO_SC6MOD2是怎样定义的.
如果它是在RAM空间分配的寄存器,它的定义需要加上volatile.
例如像这样
[code]
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

12
 
然后,调试的时候,这些读了会清0的寄存器,不要让它出现在WATCH窗口中,以免干扰
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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

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

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

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