搜索
bottom↓
回复: 11

让SBUF接收的数据存到外部RAM定义的数组时发现数组里很多...

[复制链接]

出0入0汤圆

发表于 2012-5-24 11:52:57 | 显示全部楼层 |阅读模式
如题,紧急求解。我让SBUF接收的数据存到外部RAM定义的数组时发现数组里很多数接收的不对为什么?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-27 17:40:27 | 显示全部楼层
没看到代码,不敢随便下结论,但估计可能出现的问题:
波特率设置不对、晶体频率不准、对SBUF寄存器的重复读操作、发送方速度太快导致接收方处理不过来。

出0入0汤圆

发表于 2012-6-13 16:25:51 | 显示全部楼层
eduhf_123 发表于 2012-5-27 17:40
没看到代码,不敢随便下结论,但估计可能出现的问题:
波特率设置不对、晶体频率不准、对SBUF寄存器的重复 ...

加个延时试试...

我问一下.
用串口调试助手发送一个字符串.
SBUF是一次性接收 还是分几次接收呢

出0入0汤圆

发表于 2012-6-13 17:47:07 | 显示全部楼层
nydns 发表于 2012-6-13 16:25
加个延时试试...

我问一下.
用串口调试助手发送一个字符串.
SBUF是一次性接收 还是分几次接收呢


在这个区就是51单片机了,对51单片机来说,SBUF只有1个字节的深度。

出0入0汤圆

发表于 2012-6-13 22:09:04 | 显示全部楼层
eduhf_123 发表于 2012-6-13 17:47
在这个区就是51单片机了,对51单片机来说,SBUF只有1个字节的深度。

就51来说.串口中断接收abc这三个字节.是产生一次中断还是三次中断.

出0入0汤圆

发表于 2012-6-13 23:33:03 | 显示全部楼层
3次中断,另外C51对Xdata的数据区不会自动填充0

出0入0汤圆

发表于 2012-6-14 11:49:46 | 显示全部楼层
nydns 发表于 2012-6-13 22:09
就51来说.串口中断接收abc这三个字节.是产生一次中断还是三次中断.


这个不一定的,要看中断服务程序是怎么写的。

如果中断服务程序中是读完SBUF就清空RI标志并退出,那么就是产生三次中断。

如果中断服务程序里是把协议处理完才退出,那么就只产生一次中断,只是这个过程中RI标志位被置位了3次。

出0入0汤圆

发表于 2012-6-14 13:24:42 | 显示全部楼层
eduhf_123 发表于 2012-6-14 11:49
这个不一定的,要看中断服务程序是怎么写的。

如果中断服务程序中是读完SBUF就清空RI标志并退出,那么就 ...

void main(void)
{
InitUART();//初使化串口
while(1)
{
  if(flag==1)//接收到的数据发到电脑PC串口上.
  {
   ES=0;//串口中断 关了
   flag=0;//标位清0
   SendOneByte(a);//把接收到的数据发送到PC机串口上
   ES=1;//串口中断 手动打开
   
  }
}
}

void UARTInterrupt(void) interrupt 4 //串口中断号为4
{
    if(RI)
    {
         t[j]=SBUF;
         //a=t[j];//反回PC串口
         j++;
         if(j >= 64)j=0;   
        RI = 0;        //手动清0 退出
         flag=1;//标质位等于1,说明接收到数据
   }
    else
        TI = 0;
}
我的代码
那我想产生一次中断接收所有数据.应该如何写呢...

出0入0汤圆

发表于 2012-6-14 19:47:16 | 显示全部楼层
本帖最后由 eduhf_123 于 2012-6-14 19:49 编辑
nydns 发表于 2012-6-14 13:24
void main(void)
{
InitUART();//初使化串口
while(1)
{
  if(flag==1)//接收到的数据发到电脑PC串口上.
  {
   ES=0;//串口中断 关了
   flag=0;//标位清0
   SendOneByte(a);//把接收到的数据发送到PC机串口上
   ES=1;//串口中断 手动打开
   
  }
}
}void UARTInterrupt(void) interrupt 4 //串口中断号为4
{
    if(RI)
    {
         t[j]=SBUF;
         //a=t[j];//反回PC串口
         j++;
         if(j >= 64)j=0;   
        RI = 0;        //手动清0 退出
         flag=1;//标质位等于1,说明接收到数据
   }
    else
        TI = 0;
}
我的代码
那我想产生一次中断接收所有数据.应该如何写呢...
  1. {
  2.         if(RI)
  3.         {
  4.                 unsigned char i = 3;
  5.                 do
  6.                 {
  7.                         t[j++]=SBUF;
  8.                         RI = 0;
  9.                         if(j >= 64)
  10.                         {
  11.                                 j=0;   
  12.                         }
  13.                 }while(--i);
  14.                 flag=1;
  15.         }
  16.         else
  17.         {
  18.                 TI = 0;
  19.         }
  20. }
复制代码

出0入0汤圆

发表于 2012-6-15 17:06:27 | 显示全部楼层
eduhf_123 发表于 2012-6-14 19:47

while(--i);
这个是 循环3次吧.
我试了一下 一个字节被输出了3次啊.

SBUF长度不固定呢.

出0入0汤圆

发表于 2012-6-15 19:14:02 | 显示全部楼层
本帖最后由 eduhf_123 于 2012-6-15 19:15 编辑
nydns 发表于 2012-6-15 17:06
while(--i);
这个是 循环3次吧.
我试了一下 一个字节被输出了3次啊.
  1. {
  2.         if(RI)
  3.         {
  4.                 unsigned char i = 3;
  5.                 do
  6.                 {
  7.                         //之前少了下面这个while循环
  8.                         while(!RI)
  9.                         {
  10.                                 ;
  11.                         }

  12.                         t[j++]=SBUF;
  13.                         RI = 0;
  14.                         if(j >= 64)
  15.                         {
  16.                                 j=0;   
  17.                         }
  18.                 }while(--i);
  19.                 flag=1;
  20.         }
  21.         else
  22.         {
  23.                 TI = 0;
  24.         }
  25. }
复制代码

出0入0汤圆

发表于 2012-6-18 10:45:22 | 显示全部楼层
eduhf_123 发表于 2012-6-14 11:49
这个不一定的,要看中断服务程序是怎么写的。

如果中断服务程序中是读完SBUF就清空RI标志并退出,那么就 ...

buf[j++]=SBUF;
PC串口发送A,1,22(字符型)

buf[0]为A
buf[1]为,(豆号)
buf[2]为1
buf[3]为,(豆号)
buf[4]为2
buf[5]为2
现在接收了6个字节的数据在buf[]数组中.但这不是我要的数组
我要的是
buf[0]为A
buf[1]为1
buf[2]为22
应该如何处理好呢?
这个代码咋写啊
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-11 00:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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