2 nishiala2008 nishiala2008 于 2013.11.17 12:29 提问

C语言51单片机串口通信程序求教

#include
#include
#include

#define INBUF_LEN 4 //数据长度

unsigned char inbuf1[INBUF_LEN];
unsigned char checksum,count3;
bit read_flag=0;

void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
// TH1 = 0xF4; //Baud:4800 fosc=11.0592MHz
TH1 = 0xFD; //Baud:19200 fosc=11.0592MHz
TL1 = 0xFD; //Baud:19200 fosc=11.0592MHz

// IE |= 0x90; //Enable Serial Interrupt
ES = 1; //使能串口中断
EA = 1; //打开主中断
TR1 = 1; // timer 1 run
// TI=1;
}

//向串口发送一个字符
void send_char_com(unsigned char ch)

{
SBUF=ch;
while(TI==0);
TI=0;
}

//向串口发送一个字符串,strlen为该字符串长度
void send_string_com(unsigned char str,unsigned int strlen)
{
unsigned int k=0;
do
{
send_char_com(
(str + k));
k++;
} while(k < strlen);
}

//串口接收中断函数
void serial () interrupt 4 using 3
{
if(RI)
{
unsigned char ch;
RI = 0;
ch=SBUF;
// count3=0;
inbuf1[count3]=ch;
count3++;
if(count3==(INBUF_LEN))
{
read_flag=1;
count3=0;
}

}
else if(TI)
{
TI=0;
}

}

main()
{
init_serialcomm(); //初始化串口
count3=0;
while(1)
{
if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{
read_flag=0; //取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}

}

以上程序代码参考自龚建伟 串口中断接收、发送例程。本意是通过串口发送4个字节数据,单片机串口接收后,发送回4个字节数据(在串口助手显示出来)。
但我通过uvison3下载到stc12c5a60s2最少单片机系统,通过串口测试工具(波特率19200,校验位:无,数据位:8,停止位:1)发送数据为:ff ff ff ff (十六进制发),十六进制收,结果为发送4字节,接收2字节,串口助手接收到显示为77 ff, 程序不知道是哪里出错了,求正解。

我自己分析如下:
发送4字节,只接收到2字节?首先怀疑是串口初始化问题,但查不出。再看缓存的4字节数据,也提供了足够的空间,处理上也看不出问题。哪位高手指点下。非常感谢!!!

1个回答

peiyuzhu
peiyuzhu   2013.11.19 10:01

用两个标志灯,结合keil软件调试,看程序问题出在哪里,再做更改。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!