鲁能渔与 2013-11-17 04:29 采纳率: 0%
浏览 4485

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条回答

  • flair-飞儿 2013-11-19 02:01
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页
  • ¥15 怎么让wx群机器人发送音乐
  • ¥15 fesafe材料库问题