打印
[STC单片机]

诡异的问题STC12C5A16S2

[复制链接]
3926|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单片机直接发送 电脑能全收到 电脑发送数据给单片机再转发回来 老是掉数据 用的是程序下载串口测试
程序如下:// 使用CPU芯片为STC12C5A16S2

#include "reg51.h"
#include "intrins.h"
//*******************
// 位操作用常量
#define Bits0Set        0x01        //
#define Bits1Set        0x02        //
#define Bits2Set        0x04        //
#define Bits3Set        0x08        //
#define Bits4Set        0x10        //
#define Bits5Set        0x20        //
#define Bits6Set        0x40        //
#define Bits7Set        0x80        //
#define Bits0Clr        0xfe        //
#define Bits1Clr        0xfd        //
#define Bits2Clr        0xfb        //
#define Bits3Clr        0xf7        //
#define Bits4Clr        0xef        //
#define Bits5Clr        0xdf        //
#define Bits6Clr        0xbf        //
#define Bits7Clr        0x7f        //
//***************************************************
// 通信用定义
// Define Constants
//#define FOSC 18432000L
//#define FOSC 12000000L
#define FOSC 11059200L
#define BAUD 9600
// Define UART parity mode
#define NONE_PARITY                0
#define ODD_PARITY                1
#define EVEN_PARITY                2
#define MARK_PARITY                3
#define SPACE_PARITY        4

#define PARITYBIT                NONE_PARITY


#define S2RI                0X01                // S2CON.0
#define S2TI                 0X02                // S2CON.1
#define S2RB8        0X04                // S2CON.2
#define S2TB8        0X08                // S2CON.3
//***************************************************
// define SFR
sfr AUXR                =0x8e;
        // T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS
sfr AUXR1        =0xa2;
sfr INT_CLKO        =0x8f;

sfr                S2CON = 0x9a;
sfr                S2BUF = 0x9b;
sfr                BRT = 0x9c;
sfr                IE2 = 0xaf;

sfr P5M1                = 0xC9;
sfr P5M0                = 0xCA;
sfr P5                = 0XC8;

sfr        P4M1        = 0xB3;
sfr        P4M0        = 0xB4;
sfr        P4                = 0XC0;
sfr        P4SW        = 0XBB;

sfr P3M1                = 0xB1;
sfr P3M0                = 0xB2;
sfr P2M1                = 0x95;
sfr P2M0                = 0x96;
sfr P1M1                = 0x91;
sfr P1M0                = 0x92;
sfr P0M1                = 0x93;
sfr P0M0                = 0x94;
sfr P1ASF                = 0x9D;                // P1第二功能控制寄存器

typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;

BYTE         RBUF,CHECK_SUM;

//*******************
//*******************
void Port_INIT()
{
        // 端口0初始化,p0.1 作为联动输入口,其余全作输出口
        P0M0 =         0xfd;                //0b11111101;                //
        P0M1 =         0x02;                //0b00000010;                //
        P0 = 0x02;                        //0b00000010;
        // 端口1初始化为全输入且p1.0~ p1.3作为AD输入口
        P1M0 = 0X0;                        //
        P1M1 = 0Xff;                //
        P1ASF = 0x0f;                //0b00001111;                //
        P1 = 0xff;                         //0b11111111;
        // 端口2初始化为准双向口
        P2M0 = 0X0;                        // 1000 0011
        P2M1 = 0X0;                        // 0111 1100
        P2 = 0x0;                        //0b00000000;
        // p3.1 p3.2 p3.3 p3.4 p3.5 p3.6  为输出口,p3.0为输入口
        P3M0 = 0Xfe;                // 1111 1110
        P3M1 = 0X01;                // 0000 0001
//        P3 = 0x07;                        //0b0000 0111;
//        P3 = 0x3D;                        //0b0011 1101;
//        P3 = 0x3f;                        //0b0011 1111;
        P3 = 0x33;                        //0b0011 0011;
        // p4.0(no use) p4.2(RXD2)  p4.7(RST) 为输入口,
        // p4.1(LCD_CSB) p4.3(TXD2) p4.4(LCD_DI) p4.5(LCD_CSA) p4.6(LCD_RST)为输出口
        P4SW = 0X70;                //  0111 0000
        P4M0 = 0X7a;                // 0111 1010
        P4M1 = 0X85;                // 1000 0101
        P4 = 0x8d;                        //0b1000 1101;
        // 端口5初始化为全输入
        P5M0 = 0X00;                //
        P5M1 = 0Xff;                //
        P5 = 0xff;                        //0b11111111;

}
void UART_INIT()
{
        SCON=0X50;

        TMOD        = 0X21;
//        AUXR = 0x80;
//        AUXR = 0x94;        // 0X80+0X14
        AUXR = 0xd4;
        TH1                =TL1=-(FOSC/32/BAUD);
        TR1                =1;
        ES                =1;
//        EA                =1;
}
void Uart_Isr() interrupt 4 using 1
{
        if(RI)
        {
                RI=0;
                RBUF=SBUF;
                SBUF=RBUF;                // test
        }
        if(TI)
        {
                TI=0;
        CHECK_SUM++;                // For Test
        SBUF=CHECK_SUM;        // For Test
        }
}
void main()
{
       
        Port_INIT();
        UART_INIT();
        EA                =1;
        while(1)
        {

        }       
}

相关帖子

沙发
jinjian75|  楼主 | 2014-3-11 09:43 | 只看该作者
这是上位机来个数据激活后 一直发循环数据的
屏蔽掉        CHECK_SUM++;                // For Test
        SBUF=CHECK_SUM;        // For Test
两句 就是转发的了 测试了很多次 都是少数据
但是数据不乱 应该不是波特率问题

使用特权

评论回复
板凳
ningling_21| | 2014-3-11 09:52 | 只看该作者
这里改一下,试试看

if(RI)
        {
                RI=0;
                SBUF=SBUF;
            
        }

使用特权

评论回复
地板
jinjian75|  楼主 | 2014-3-11 10:34 | 只看该作者
本帖最后由 jinjian75 于 2014-3-11 10:40 编辑

这是测试串口的程序 我程序出现掉数据包 查原因查到这的
换你说那种写发也一样
测试数据 没100mS发送00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 接收回来的变这样了 才发720 只收回来717 就少3个了

使用特权

评论回复
5
coody| | 2014-3-11 11:23 | 只看该作者
异步串口,直接SBUF=SBUF;不掉数据才怪。
应该使用缓冲队列。STC的官网有完整的例程的。

使用特权

评论回复
6
coody| | 2014-3-11 11:27 | 只看该作者
另外,诡异的不是MCU,是你的程序。串口收到一个字节,但是你却不能马上在几个时钟内操作SBUF=SBUF;,MCU已经在进入第一个bit的搜索了,这样,你执行了SBUF=SBUF;也得等下一个bit的时候到了才可以执行,而PC端是没有间断的。这一点点时间差就会导致累积错误。使用缓冲队列就可以避免。即使在32位MCU上也是一样的问题。

使用特权

评论回复
7
ningling_21| | 2014-3-11 11:38 | 只看该作者
用的是什么软件测试的呢?

使用特权

评论回复
8
jinjian75|  楼主 | 2014-3-11 11:59 | 只看该作者
本帖最后由 jinjian75 于 2014-3-11 12:00 编辑

RBUF 就是RAM寄存器 做缓存的啊 SBUF=SBUF是3楼建议的一个写法
  RBUF=SBUF;
SBUF=RBUF;  // test  我习惯是用RAM寄存器转一下的

用的stc的下载程序带的串口测试功能

使用特权

评论回复
9
sz_longyue| | 2014-3-11 12:54 | 只看该作者
是不是波特率误差太大?PC端的串口对波特率误差容忍程度会大些。
还有是不是设置了奇偶校验?

使用特权

评论回复
10
jinjian75|  楼主 | 2014-3-11 14:15 | 只看该作者
波特率误差0.2%  初始化UART就上面那样 怎么可能有奇偶校验啊

使用特权

评论回复
11
jinjian75|  楼主 | 2014-3-12 17:08 | 只看该作者
没人遇到过??

使用特权

评论回复
12
jinjian75|  楼主 | 2014-3-13 14:58 | 只看该作者
哎 只能协议上保证了 浪费点通信效率

使用特权

评论回复
13
zzhhxx| | 2014-5-1 01:57 | 只看该作者
因为51的。收发是一个中断,所以不要收发都用中断来完成,特别是低波特率的时候,在中断里接收,然后在主程序里发送,中断里不要对处理。或者你调高波特率。

使用特权

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

本版积分规则

4

主题

23

帖子

0

粉丝