本帖最后由 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;
}
|