通过单片机向pc发送1234,为啥只能发出1呢?

#include"reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
u8 t[]={1,2,3,4};

void io()
{
	 TMOD=0x20;
	 TH1=0xF4;
	 TL1=0XF4;
	 PCON=0X80;
	 TR1=1;
	 SCON=0X50;
	 ES=1;
	 EA=1;
}
void main()
{
		u8 i;
     	io();       
		for(i=0;i<4;i++)
	       {
	        SBUF=t[i];
         	while(!TI);
            TI=0;
	        ES=1;
	       }
     
}
void zhongduan() interrupt 4
{

	while(1);
}

 

参考GPT和自己的思路:

根据您提供的代码,我发现在发送数据的循环中,每次发送数据之后立即对 ES 标志位进行设置,这会导致中断服务程序不断地执行,但并没有对接收数据进行处理,因此 pc 只会接收到第一个数据。正确的方法需要在接收数据时再将 ES 标志位设置为 1,以便能够正确地接收完整的数据。您可以尝试修改代码中的 ES 标志位的设置位置,使其在接收数据时才进行设置。另外,您也可以在中断服务程序中添加相关处理逻辑,以便正确处理接收到的数据。

参考GPT和自己的思路:

根据代码,单片机通过串口(SCON=0X50)来向PC发送数据,其中TH1和TL1是定时器的初值,用于设置波特率。按照你的描述,代码中发送的数据是数组t[]={1,2,3,4},但是只能发送出1,这可能是由于以下原因:

1.波特率设置不正确。需要将TH1和TL1的值根据实际的波特率设置正确,否则可能导致数据发送不出去或接收不到。

2.串口发送数据的方式不正确。代码中采用的是中断方式(ES=1),但是中断处理函数zhongduan()里面没有处理发送数据的逻辑,可能导致数据发送不完整。

3.PC端接收数据的程序有问题。在单片机发送数据的同时,PC端也需要编写程序进行数据的接收和处理,否则会出现类似于只接收到1的情况。

针对以上问题,可以尝试调整波特率的值、修改中断处理函数或者检查PC端的接收程序是否正确等。