打印

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

[复制链接]
1327|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方式?

使用特权

评论回复
5
tcc8073|  楼主 | 2014-10-10 18:52 | 只看该作者
我没有说清楚,其实是采用的无校验接收方式

使用特权

评论回复
6
tcc8073|  楼主 | 2014-10-12 17:37 | 只看该作者
有哪位高手有做过吗,指点下,上面程序虽然可以通讯,但是不稳定,接收会丢数据.

使用特权

评论回复
7
ningling_21| | 2014-10-12 18:49 | 只看该作者
tcc8073 发表于 2014-10-12 17:37
有哪位高手有做过吗,指点下,上面程序虽然可以通讯,但是不稳定,接收会丢数据. ...

改成8位数据格式再试试...

使用特权

评论回复
8
icekoor| | 2014-10-12 22:01 | 只看该作者
void com_interrupt(void) interrupt 4 using 3
中断里的COM_send(buffer);最好不要在中断内部发送;

使用特权

评论回复
9
icekoor| | 2014-10-12 22:07 | 只看该作者
51单片机好久不用了,给你个简单例程吧!
51串口联机.rar (722 Bytes)


使用特权

评论回复
10
tcc8073|  楼主 | 2015-1-18 21:40 | 只看该作者
问题已经解决,是测试软件的问题,谢谢!

使用特权

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

本版积分规则

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

179

主题

1359

帖子

7

粉丝