C51串口工作方式3偶校验接收发送有问题

[复制链接]
1611|9
 楼主| tcc8073 发表于 2014-10-10 17:12 | 显示全部楼层 |阅读模式
本帖最后由 tcc8073 于 2014-10-11 17:58 编辑

  查询方式发送可以,但是接收有问题,发送的时候PC使用奇校验方式也能正确收到数据,但是PC采用N方式收到乱码
#include <reg52.h>
#define    BUFFERLEGTH 10
sbit RDSTADUS=P1^7;  //控制485读写,0为读,1为写
//-----------------------------------------------------------------
void UART_init();                //串口初始化函数
void COM_send(unsigned char bufferx);             //串口发送函数
char str[20]="hello MCU";
bit  flag=0;
unsigned char buffer;
void Delay2ms()  [url=]//@22.1184MHz[/url]
{
unsigned char i, j;
i = 44;
j = 4;
do
{
   while (--j);
} while (--i);
}
//-------------------------------------------------------------------
void main(void)
{
unsigned char i;
UART_init();        //初始化串口
RDSTADUS=0;
  while(1)
  { RDSTADUS=0;
    //if(flag==1)
    //{  COM_send(buffer);
    //Delay2ms();
    //for(i=0;i<9;i++)
      //COM_send(str);
//}
  }
}

//-------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//             串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{                      //初始化串行口和波特率发生器
SCON =0XD2;           //选择串口工作方式1,打开接收允许
TMOD =0x21;           //定时器1工作在方式2,定时器0工作在方式1
TH1  =TL1=0xfA;       //实现波特率9600(系统时钟11.0592MHZ)
PCON = 0x00;
TR1 =1;               //启动定时器T1
ET1 =0;
ES=1;                 //允许串行口中断
PS=1;                 //设计串行口中断优先级
EA=1;                 //单片机中断允许
}
//------------------------------------------------------------
void COM_send(unsigned char bufferx)
{  RDSTADUS=1;
     ES=0;
     ACC= bufferx;
     TB8=P;
     SBUF=bufferx;
     while(!TI);
     TI=0;
  flag=0;
  ES=1;
}
//--------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
void com_interrupt(void) interrupt 4 using 3
{  ES=0;
   if(RI)                  //处理接收中断
   {  RI=0;                //清除中断标志位
      buffer=SBUF;         //接收串口数据
   flag=1;
   Delay2ms();
   COM_send(buffer);
   }
   if(TI)TI=0;
   ES=1;
}
qq4988 发表于 2014-10-10 17:20 | 显示全部楼层
在网上找个例子,研究一下
wangch_sh 发表于 2014-10-10 17:23 | 显示全部楼层
哪个系列51有3个串口?
ningling_21 发表于 2014-10-10 17:36 | 显示全部楼层
PC采用N方式

什么是N方式?
 楼主| tcc8073 发表于 2014-10-10 18:52 | 显示全部楼层
我没有说清楚,其实是采用的无校验接收方式
 楼主| tcc8073 发表于 2014-10-12 17:37 | 显示全部楼层
有哪位高手有做过吗,指点下,上面程序虽然可以通讯,但是不稳定,接收会丢数据.
ningling_21 发表于 2014-10-12 18:49 | 显示全部楼层
tcc8073 发表于 2014-10-12 17:37
有哪位高手有做过吗,指点下,上面程序虽然可以通讯,但是不稳定,接收会丢数据. ...

改成8位数据格式再试试...
icekoor 发表于 2014-10-12 22:01 | 显示全部楼层
void com_interrupt(void) interrupt 4 using 3
中断里的COM_send(buffer);最好不要在中断内部发送;
icekoor 发表于 2014-10-12 22:07 | 显示全部楼层
51单片机好久不用了,给你个简单例程吧!



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| tcc8073 发表于 2015-1-18 21:40 | 显示全部楼层
问题已经解决,是测试软件的问题,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:诚信,务实,专业,创新

179

主题

1358

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部