搜索
bottom↓
回复: 7

求助,51串口接收和回显

[复制链接]

出0入0汤圆

发表于 2011-12-9 13:41:16 | 显示全部楼层 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag;
uint a;
void main()
{
        TMOD=0x20;//定时器为方式2
        TH1=0xfd;//波特率为9600
        TL1=0xfd;
        PCON=0;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        ES=0;
                        flag=0;
                        SBUF=a;
                        while(!TI);
                        TI=0;
                        ES=1;
                }

        }
}


void ser() interrupt 4
{
        RI=0;
        P0=SBUF;
        a=SBUF;
        flag=1;
}
我想从串口调试助手上直接发一个数到串口上点亮led灯,再把发送的数据直接回显到调试助手,但每次发送的数据都不是预期的,例如发aa就显示0x1e或其他的数,而且回显的数据也是时有时无,想得头都快爆了,求各位大侠指教!!!!!!

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

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

出0入0汤圆

发表于 2011-12-9 17:55:17 | 显示全部楼层
我也纠结了这个好久 - -

出0入0汤圆

 楼主| 发表于 2011-12-9 21:21:16 | 显示全部楼层
回复【楼主位】tuxingyulin  
-----------------------------------------------------------------------

自顶一个,哪位大虾能帮忙解决一下啊,小弟感激不尽…………

出0入0汤圆

 楼主| 发表于 2011-12-23 20:33:12 | 显示全部楼层
前阵子一直没空,到这两天才有空上论坛,自己的问题已经解决了,主要是晶振的误差问题,因为自己的实验板是用12点多的晶振,误差比较大,而选择的波特率又较高,故导致传输的数据不对,用低一些的波特率就可以了,如2400的波特率,自顶一个,以供大家参考。

出0入0汤圆

发表于 2011-12-27 10:46:00 | 显示全部楼层
#include <reg52.h>
#include <string.h>

unsigned char g_ucRecBuff[20] = {0};
unsigned int g_iRecNum=0;
bit bReadOver=0;
//sbit Speak =P1^2;


//向串口发送一个字符
void SendChar(unsigned char ch)  
{
    SBUF=ch;
    while(TI==0);
    TI=0;
}

//向串口发送一个字符串,strlen为该字符串长度
void SerialSend(unsigned char *str,unsigned int strlen)
{
    unsigned int k=0;
    do
    {
        SendChar(*(str + k));
        k++;
    } while(k < strlen);
}

/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Serial_Int(void) interrupt 4 using 3
{
        ES = 0;
        if(RI == 1)   //当硬件接收到一个数据时,RI会置位
        {
                g_ucRecBuff[g_iRecNum] = SBUF;                 //把从串口读出的数存到数组
                RI = 0;
                g_iRecNum++;
                if(g_iRecNum == 20)
                {
                        g_iRecNum = 0;                //当com_dat = 21时,清0,防止数组溢出
                        bReadOver = 1;

                }
        }
        ES = 1;
}

/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void SerialInit(void)
{
     TMOD = 0x20;   //定时器工作在定时器1的方式2
     PCON = 0x00;   //不倍频
     SCON = 0x50;        //串口工作在方式1,并且启动串行接收       
     TH1 = 0xFd;    //设置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;                //启动定时器1
         ES = 1;                //开串口中断
         //EA = 1;                //开总中断
         g_iRecNum=0;
         memset(g_ucRecBuff,0xff,sizeof(g_ucRecBuff));
         bReadOver=0;               
}

//返回接收到的字符
unsigned int GetRecDate(unsigned char *pucRec)
{
        if(bReadOver)
        {
                memcpy(pucRec,g_ucRecBuff,20);
                memset(g_ucRecBuff,0,sizeof(g_ucRecBuff));
                bReadOver=0;
                g_iRecNum=0;               
                return 1;
        }
        return 0;
       
}

出0入0汤圆

发表于 2012-2-13 12:39:20 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-6-13 09:24:01 | 显示全部楼层
wanyhong2012 发表于 2011-12-27 10:46
#include
#include

g_ucRecBuff[g_iRecNum] = SBUF;                 //把从串口读出的数存到数组
                RI = 0;
                g_iRecNum++;
                if(g_iRecNum == 20)
                {
                        g_iRecNum = 0;                //当com_dat = 21时,清0,防止数组溢出
                        bReadOver = 1;

                }

这个对吗?

出0入0汤圆

发表于 2012-12-13 18:58:57 | 显示全部楼层
你怎么接受串口通信的 ?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 20:27

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

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