使用的型号是STC89C52,定时器2做波特率发生器,9600,晶振11.0592M,能发送数据字符给上位机,但是上位机发数据给单片机就出问题了,不开ES的话接收不了,这个应是正常现象,但打开接收允许开关ES后一直进接收中断,这个是我初始化不对还是串口接收中断写错了?请各位前辈指点下
(以下是我的串口初始化和接收中断和主函数)
/*********************************************
FunctionName: uartInit
FunctionInfo: 定时器2(波特率发生器)初始化
Input: no
Output: no
注:使用RCAP2H去重装TH2,用RCAP2L去重装TL2,与其他不同
bps=f0cs/[n*(65536-x)] :x位高低位 n=32(12时钟模式)
9600=11059200/[32*(65536-x)]:x=65500=0xffdc
**********************************************/
void uartInit(void)
{
SCON =0x50;//串行口中断方式1 允许接受 (8位异步通讯) 10位UART
PCON =0x00;
ES = 1; //串口中断允许位,仅是串口的中断开关 //仅是发送的话可以不要
EA = 1;
RCAP2H =0xff;
RCAP2L =0xdc;
TH2=RCAP2H;
TL2=RCAP2L;
RCLK = 1;//RCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的接收时钟
TCLK = 1;//TCLK置位时,定时器2的溢出脉冲作为串行口模式1和模式3的发送时钟
TR2 = 1;//定时器2启动/停止控制位.置1时启动定时器
C_T2 = 0;//定时器/ 计数器选择.0=内部定时器(OSC/12或OSC/6)
TI = 1;//发送中断标记位,必须设置 //在不使用printf使用自己构造的函数可以不要
}
void UART() interrupt 4 using 3
{
//ES = 0; //暂时关闭串口中断允许位
if(RI)
{
RI = 0; //接收中断标志位 由软件清零
tempRx = SBUF;
//rxBuff[rxCnt] = tempRx;
*( (uchar *)&gRxBuff.add + rxCnt ) = tempRx; //指针转换不对的话左值不正确
rxCnt++;
gRxFlag =1; //接收标志
//gTime.rxDly = T_50MS; //超出50ms算一帧数据接收完
}
printf("inRx"); //为什么一直响应这个接收中断
//ES = 1;
}
void main(void)
{
//WDT_Init();
lcdBack = ZERO; //上电默认LCD背光不亮
EMI_Down51(); //降低MCU对系统的电磁干扰EMI
LCD12864_Init(); //液晶屏初始化
gVariableTimeInit(); //定时器变量初始化
poetryInit(); //诗词结构体数组初始化
keyFlagInit(); //按键标志初始化
timerInit2(); //定时器初始化
uartInit();
//text_TX("HelloWord\n");
printf("HelloWord\n");
while(1)
{//以下省略......
|
多谢各位前辈的提醒,目前已经调试OK,使用MODBUS的数据格式都能接收到正确的数据了,谢谢啦!