请问51单片机如何解决多字节串口发送 接收问题

我用的是STC89C52,BAUD=57600,串口协议需要一次发送3个字节数据,然后接收5个字节数据,取第三个,和第四个数据 程序部分如下:

uchar shuju[5]={0};
uchar cont=0;
void init_serialcom( void )
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
//UART为模式1,8位数据,允许接收
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
//定时器1为模式2,8位自动重装
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFF ; //Baud:57600 fosc=12MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;

}
//向串口发送一个字符
void send_char_com( unsigned char ch)
{
SBUF=ch;
while (TI== 0);
TI= 0 ;
}

//串口接收中断函数
void UART_SER (void) interrupt 4 //串行中断服务程序
{

if( RI) //判断是接收中断产生
{ RI=0; //标志位清零

shuju[cont]=SBUF;
cont++;

}
if(TI) //如果是发送标志位,清零
TI=0;
}

void chuanshuju()//发送传数据指令
{
send_char_com(0xf0);
send_char_com(0xc0);
send_char_com(0xb0);

}
void main()
{chushuju();}
现在是发送指令后,没有成功,协议没完成。程序到chuanshuju就跑不过去。

void init_serialcom 没在main里面调用,你们的串口没初始化。那句 TI=1;
什么用。while (TI== 0); TI= 0 ;中断里面清了 这里再清一遍??
cont++;只有加,没有清零,你只准备接受一次???不带包头识别,你怎么知道什么时候cont应该等于0.总之还有很多问题。追问

主函数那里我没都写上
void main()
{
uchar i;
init_lcd();
clrgdram();
init_serialcom(); //初始化串口
d_dian(10,10,1);
chuanshuju();
d_dian(30,30,1)}
我这是在液晶上打点,chuanshuju前打点能打上,传数据后的打点打不出来,从而验证串口这一块没做好。while(TI==0);TI=0是检测数据的,因为接受完数据后,TI自动变为1,得重新把他置为0.

追答

TI是发送中断标志位吧,你中断里面清了,后面就不需要清了。其实串口,LCD这个程序,你可以直接在网上网上很多,找例程,看下别人怎么写的。

温馨提示:答案为网友推荐,仅供参考
相似回答