打印

51单片机串口接收字符串错误怎么办?

[复制链接]
7399|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fengzj|  楼主 | 2010-9-16 16:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用伟福仿真器,晶振12MHz,波特率2400bps。
void serial_Init(void)  //模式1,8位自动重装,2400bps,12MHz
{
  SCON=0x50;//串口工作方式为1,SCON允许串口接收位REN置1
  TMOD=0x20;//工作方式控制寄存器TMOD,控制定时器1工作在模式2,8位自动重装
  TH1=0xF3; //定时计数器1高8位
  TL1=0xF3; //定时计数器1低8位,设置T1的溢出率
  TR1=1;//定时控制寄存器TCON中的运行控制位,置1表示计数器1启动工作
  ES=1;//打开串口中断
  EA=1;//允许中断
  RI=0;
  TI=0;
}

uchar data Send_string=0;//接收数据完成标志,1表示完成
uchar data len=0;
uchar data N;
uchar data b;
sbit Pin=P0^6;//管脚P0^6用作通讯显示
com_interrupt(void) interrupt 4         //串口中断子程序
{
   Pin=0;//通讯指示灯亮
if(RI)
{
  RI = 0;
  b=SBUF;
  if((b==0xBB)&&(len==0))//接收开始符为0xBB的数据
  {
    temp[0]=b;//将开始符赋给temp[0]
  }
  else//继续接收开始符0xBB后的数据
  {
    len++;
    temp[len]=b;
    if(len>6)
    {
      if((b==0xDD)&&(len>=temp[6]+8))//收到结束符且数据长度为(temp[6]+8)(这是字符串的要求)时,结束接收
   {
     N=len;//传递数据长度,数据长度为(N+1)
                          len=0;//置0,便于下一次接收
     Send_string=1;//接收完成标志
    }
     }
   }
}
Pin=1;//通讯指示灯灭
}
波特率应该没问题,因为已经接收到数据只是接收的错误。而且之前做过接受一个字节的实验,当时接收的是正确的。
该中断子程序要接收的是以BB作为开始符,以DD作为结束符的一个字符串。
当用串口助手以16进制发送:BB 00 00 00 01 21 05 01 00 77 55 00 01 AF DD时,data区显示的接收到的数据始终是22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 07,后来变成22 FF FF FD BD F5 FD FF 11 55 FF FD A1 11 ,少了一个07。我怀疑是中断子程序的问题,可是我也没看出来哪里有问题。本人初学51C语言,请教高手这是为什么呢

相关帖子

沙发
ayb_ice| | 2010-9-16 16:42 | 只看该作者
if(RI)
{
  RI = 0;
  b=SBUF;
改为
if(RI)
{
  b=SBUF;
  RI = 0;

使用特权

评论回复
板凳
fengzj|  楼主 | 2010-9-17 07:59 | 只看该作者
我改过了,也是一样。现在是接收的总是比我发送的少一个字节

使用特权

评论回复
地板
airwill| | 2010-9-17 10:36 | 只看该作者
少一个字节?

通常这样的情况, 很可能是边界问题. 仔细分析你的程序看看

使用特权

评论回复
5
witty01| | 2010-11-11 17:27 | 只看该作者
你的问题解决了吗?我也碰过类似的,我也用伟福的仿真器,发送接收都不对,但都有点通讯的样子,快吐血之前烧了下片子,发现是仿真器的毛病,****

使用特权

评论回复
6
chunyang| | 2010-11-11 18:31 | 只看该作者
楼上情况不会是仿真器的问题,多半是波特率设置错了。楼主的问题在于自己的程序有误。

使用特权

评论回复
7
sunsigeshuai| | 2010-11-11 18:46 | 只看该作者
各位大侠,单片机电子琴的关键技术是什么?????????
跪求回复

使用特权

评论回复
8
code-03| | 2010-11-12 10:15 | 只看该作者
楼上,电子琴其实很简单的,就用到矩阵键盘扫描和音节的高低频率、设置好就搞定了、

使用特权

评论回复
9
coody| | 2010-11-12 12:15 | 只看该作者
LS,你这是简单的音调发生器,实际再玩具级的电子琴(市场卖小孩玩的,价格在99~299元之间),都有很多种音色和节奏,有的可以做8通道的和弦输出,但是MCU往往是1~5元,这类MCU都有一般MCU所没有的电路。(下面是我另一贴的回复)

电子琴MCU基本要求:
1、多通道音调发生器(比如多通道可重状定时器、PCA等等)。
2、DAC(注意不是PWM),最好是2通道以上。
3、多通道硬件乘法计算(做音色包络波或音量)。

比如消费类的电子琴,用台系的MCU做的,一般有8通道的音调。

专业电子琴,则要复杂得多,不再讲述。

使用特权

评论回复
10
crule19870104| | 2010-11-12 13:52 | 只看该作者
if(RI)
{
  RI = 0;
  b=SBUF;
改为
if(RI)
{
  b=SBUF;
  RI = 1;

使用特权

评论回复
11
cahu| | 2010-11-12 15:45 | 只看该作者
怪事

使用特权

评论回复
12
lixuan2165| | 2010-12-5 12:01 | 只看该作者
波特率设置的可能性大些。

使用特权

评论回复
13
NE5532| | 2010-12-5 12:09 | 只看该作者
1.停用仿真器
2.检查波特率

使用特权

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

本版积分规则

0

主题

2

帖子

1

粉丝