打印

每次只发送一个字符能返回,多于一个字符时返回就乱码?

[复制链接]
4084|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shell.albert|  楼主 | 2010-12-11 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在使用最简单的51单片机做串口通信实验,起初我是用单片机不断的向PC机发送A~Z这26个英文字母,没有问题,PC机都能收到,没有乱码,很正常。。

但是当我使用中断的时候,每从PC机收到一个字节,便在中断函数中立即将这个字符再回发给PC机,每次发送一个字节可以,但是当PC机向下一起发送超过一个字节的时候,单片机就返回不了了,是一些没有规律的乱码,请问这是怎么回事啊?

是不是单片机处理不过来两个字节的内容啊?


中断函数如下:

void uart0_isr(void interrupt 0{
  char temp;
  if(RI0==1){
     RI0=0;
     temp=SBUF0;
     uart0_send_byte(temp);
  }
}

串口发送函数如下:
void uart0_send_byte(char ch){
  SBUF0=ch;
  while(!TI0);
  TI0=0;
}

相关帖子

沙发
shell.albert|  楼主 | 2010-12-11 11:42 | 只看该作者
是不是PC机发送的速度太快了,而单片机发送的速度有限,这样我在中断函数里必须一次性的全部接收完,然后在让单片机发送回去呢?


我不能在中断函数里调用发送函数,发送会占用很长时间吗? 导致单片机不能及时的接收到下一个字节的数据?

使用特权

评论回复
板凳
Cupid天波| | 2010-12-11 11:57 | 只看该作者
我觉的可能是你没有规定字符串的长度

使用特权

评论回复
地板
老鱼探戈| | 2010-12-11 12:59 | 只看该作者
试试把中断 中的  uart0_send_byte(temp) ;   放到中断外?

使用特权

评论回复
5
airwill| | 2010-12-11 13:37 | 只看该作者
我感觉 波特率不配也是个可能性, 用示波器检查一下, pc 和 单片机发出的数据的位宽度时间是否一致, 因为最大不允许超过 5%, 检查波形的时候可要看仔细了

使用特权

评论回复
6
cw0wto| | 2010-12-11 14:04 | 只看该作者
:)

使用特权

评论回复
7
shell.albert|  楼主 | 2010-12-11 18:33 | 只看该作者
波特率肯定没有问题,现在的问题是每次PC机发送一个字符,单片机能接收到,并能正确返回,当多于一个字符的时候就Over了.

使用特权

评论回复
8
928315| | 2010-12-12 12:25 | 只看该作者
PC端用现成的串口调试工具还是自己写的?

如果是自己写的。多注意上位机串口配置,比如TIMEOUT那几个参数。。还有缓冲区。。。。

使用特权

评论回复
9
lbc___| | 2010-12-12 13:00 | 只看该作者
你在接收中断里发送,需要时间,在这个等的时间里,PC发过来的数据被覆盖了。

使用特权

评论回复
10
maxhai| | 2010-12-12 13:12 | 只看该作者
你用的RS232传输的吧。。。传输的原理应该是变成ASCII码传输的

使用特权

评论回复
11
shell.albert|  楼主 | 2010-12-13 16:29 | 只看该作者
哈哈,终于解决了,问题有二:
1、数据乱码,是我的波特率有误差,时有乱码是我的供电不足。
2、在串口中断中发送会浪费时间,错过下一个接收字节,后来我使用了缓冲区,OK。

使用特权

评论回复
12
anzongying| | 2013-11-23 21:32 | 只看该作者
楼主qq多少啊

使用特权

评论回复
13
瓜小坏| | 2014-11-18 14:19 | 只看该作者
缓冲区的问题可以细讲讲吗,我也遇到一样的问题,楼主在哪里

使用特权

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

本版积分规则

个人签名:烟台电工@張紹言

32

主题

1934

帖子

8

粉丝