求教一个C8051F310单片机的串口通信问题
我刚开始接触单片机,做了一个程序,实现的功能就是从PC机上接收一个字符串,然后就回发到PC机上,利用串口调试助手来发送和接收显示,但是做了好几天,都没找到毛病,希望有人能指教一下.程序如下:
//波特率为115200
#include <c8051f310.h>
#define uchar unsigned char
#define uint unsigned int
#define MaxLen 100
//----------------------------------------
//硬件地址
//----------------------------------------
sbit LED1=P3^3;
sbit LED2=P3^4;
uint readflag=0;//读标志
uchar idata RxData[MaxLen]; //接收数据存放位置
//-----------------------------------------
// 端口初始化
// P0.4 - UART TX
// P0.5 - UART RX
//-----------------------------------------
void PORT_Init (void)
{
P3MDOUT |= 0x18; // 使能 LED p3.3, p3.4为推挽输出
XBR0 = 0x01; // 交叉开关使能 UART P0.4(TX) and P0.5(RX)
XBR1 = 0x40; //使能交叉开关
}
//-----------------------------------------
// 系统时钟初始化
//-----------------------------------------
void SYSCLK_Init (void)
{
OSCICN |= 0x83; // 配置内部振荡器的的最大频率 1000 0011
RSTSRC = 0x04; // 使能始终丢失检测寄存器
}
//-----------------------------------------
// 串口初始化
//-----------------------------------------
void UART0_Init (void)
{
SCON0 = 0x10; //波特率可编程8位UART,UART接收允许
CKCON = 0x08; //定器1使用系统时钟(=0x08可将波特率设为115200,=00可将波特率设为9600)
TMOD = 0x20; //定时器1设为自动重装8位计数定时器
TH1=0X96; //为波特率装定时器初值
TL1=TH1;
TR1 = 1; //起动定时器1
}
//-----------------------------------------
// 延时程序
//-----------------------------------------
void Delayms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<200;j++);
}
//-------------------------------------
//串口发送一个字节
//-------------------------------------
void Putchar(char c)
{
SBUF0=c; //发送一个字节
while(TI0==0); //等待发完一个字节
TI0=0; //清除发送中断标志
//readflag -=1;
}
//-------------------------------------
//串口发送接收到的数据存储区中的字符串
//-------------------------------------
void Putsting(char *ptr)
{
int i=0;
while(*(ptr+i) != '\0') //判断是否发完一个字符串
{
Putchar(*ptr);
ptr++;
i++;
//LED1=1;
};
//LED1=~LED1;
}
//----------------------
//系统初始化
//---------------------
void sys_init(void)
{
PCA0MD &= ~0x40; // 禁止看门狗
PORT_Init(); // 初始化端口I/O
SYSCLK_Init (); //初始化系统时钟
UART0_Init(); //串口初始化
ES0=1; //开串行中断
TI0=0;
//TR0=1;
//延时2秒后灯灭
LED1=1;
LED2=1;
Delayms(2000);
LED1=0;
LED2=0;
}
//-----------------------------------------
// 串行中断服务程序
//-----------------------------------------
void UART0_ISR (void) interrupt 4
{
uint i=0;
uchar temp_Tx;
if(RI0==1)
{
RI0=0; //复位接收中断标志位
temp_Tx=SBUF0; //接收数据到缓存
//flag_Tx=1; //打开中断发数标志位
i++;
if(i > MaxLen-1)
{
i = 0;
}
RxData[i]=temp_Tx;
readflag=1;
}
TI0=0; //复位发送中断标志位
}
//-----------------------------------------
// 主程序
//-----------------------------------------
void main (void)
{
sys_init();//初始化系统
EA=1; //开总中断
while(1)
{
if(readflag)
{
readflag=0;
Putsting(RxData);
LED2=1;
}
}
[解决办法]
起码你自己要定位
是发送错误了,还是接收问题?
是没有显示,还是显示乱码?
是中断不进,还是进去不出来?
[解决办法]
波特率太高了吧、你调低点试试,19200试试
还有可能是开发板的问题
你可以找另外一块开发板来下载程序,看能不能通讯
还有你到底是什么问题,是不能不能接受还是不能显示。?
或者是收到乱码?