哼嘿哈嘿哈 发表于 2014-8-12 19:07:52

stc15奇怪的串口发送问题(keil 0xfd bug 问题已解决)

本帖最后由 哼嘿哈嘿哈 于 2014-8-12 20:45 编辑

最近在做一个项目时,需要发送 “正常” 二个字,但是发出来总是乱码,后来查出是因为“正常”转换为十六进制为 D5 FD B3 A3 而发送出来的“正常”为D5B3 A3即“正”字不正常,一开始我以为是程序原因,使用官方例程依然这样,从串口2转换到串口1还是这样的毛病,因为一些其它原因,不想直接一个字节一个字节的发送,也想知道问题的原因,求大神帮忙,谢谢了!有使用stc15的童鞋能帮忙测试一下么?
将最下方附件放到/keil/c51/bin/下,运行后点击start即可。
附上串口2官方发送函数


/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 定时器2用作串口2的波特率发生器举例------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序   */
/* 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序   */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为18.432MHz

#include "reg51.h"
#include "intrins.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 18432000L          //系统频率
#define BAUD 115200             //串口波特率

#define NONE_PARITY   0       //无校验
#define ODD_PARITY      1       //奇校验
#define EVEN_PARITY   2       //偶校验
#define MARK_PARITY   3       //标记校验
#define SPACE_PARITY    4       //空白校验

#define PARITYBIT EVEN_PARITY   //定义校验位

sfr AUXR= 0x8e;               //辅助寄存器
sfr S2CON = 0x9a;               //UART2 控制寄存器
sfr S2BUF = 0x9b;               //UART2 数据寄存器
sfr T2H   = 0xd6;               //定时器2高8位
sfr T2L   = 0xd7;               //定时器2低8位
sfr IE2   = 0xaf;               //中断控制寄存器2

#define S2RI0x01            //S2CON.0
#define S2TI0x02            //S2CON.1
#define S2RB8 0x04            //S2CON.2
#define S2TB8 0x08            //S2CON.3

sfr P_SW2   = 0xBA;             //外设功能切换寄存器2
#define S2_S0 0x01            //P_SW2.0

bit busy;

void SendData(BYTE dat);
void SendString(char *s);

void main()
{
    P_SW2 &= ~S2_S0;            //S2_S0=0 (P1.0/RxD2, P1.1/TxD2)
//P_SW2 |= S2_S0;             //S2_S0=1 (P4.6/RxD2_2, P4.7/TxD2_2)

#if (PARITYBIT == NONE_PARITY)
    S2CON = 0x50;               //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    S2CON = 0xda;               //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
    S2CON = 0xd2;               //9位可变波特率,校验位初始为0
#endif

    T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
    T2H = (65536 - (FOSC/4/BAUD))>>8;
    AUXR = 0x14;                //T2为1T模式, 并启动定时器2
    IE2 = 0x01;               //使能串口2中断
    EA = 1;

    SendString("STC15F2K60S2\r\nUart2 Test !\r\n");
    while(1);
}

/*----------------------------
UART2 中断服务程序
-----------------------------*/
void Uart2() interrupt 8 using 1
{
    if (S2CON & S2RI)
    {
      S2CON &= ~S2RI;         //清除S2RI位
      P0 = S2BUF;             //P0显示串口数据
      P2 = (S2CON & S2RB8);   //P2.2显示校验位
    }
    if (S2CON & S2TI)
    {
      S2CON &= ~S2TI;         //清除S2TI位
      busy = 0;               //清忙标志
    }
}

/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
    while (busy);               //等待前面的数据发送完成
    ACC = dat;                  //获取校验位P (PSW.0)
    if (P)                      //根据P来设置校验位
    {
#if (PARITYBIT == ODD_PARITY)
      S2CON &= ~S2TB8;      //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
      S2CON |= S2TB8;         //设置校验位为1
#endif
    }
    else
    {
#if (PARITYBIT == ODD_PARITY)
      S2CON |= S2TB8;         //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
      S2CON &= ~S2TB8;      //设置校验位为0
#endif
    }
    busy = 1;
    S2BUF = ACC;                //写数据到UART2数据寄存器
}

/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
    while (*s)                  //检测字符串结束标志
    {
      SendData(*s++);         //发送当前字符
    }
}

BXAK 发表于 2014-8-12 19:34:13

keil 的问题,具体百度“keil FD BUG”

fzkqi 发表于 2014-8-12 19:34:55

搜keil 0xFDbug

哼嘿哈嘿哈 发表于 2014-8-12 20:06:10

BXAK 发表于 2014-8-12 19:34
keil 的问题,具体百度“keil FD BUG”

哦哦,谢谢,我之前听过这个问题,原来是这里啊,谢谢了

哼嘿哈嘿哈 发表于 2014-8-12 20:06:42

fzkqi 发表于 2014-8-12 19:34
搜keil 0xFDbug

谢谢,终于知道0xfd问题是啥了{:smile:}

guoj 发表于 2014-8-12 20:36:08

有0xfd补丁程序的

哼嘿哈嘿哈 发表于 2014-8-12 20:46:26

guoj 发表于 2014-8-12 20:36
有0xfd补丁程序的

恩恩 已经顺手上传了

judge 发表于 2014-8-24 11:45:31

谢谢分享
页: [1]
查看完整版本: stc15奇怪的串口发送问题(keil 0xfd bug 问题已解决)