串口发送数据的函数,但串口不停的向外发数据,该怎么才能只发一次?

串口发送数据的函数,但串口不停的向外发数据,该怎么才能只发一次?
写了一个串口发送数据的函数,在向SBUF中写完数据后,串口就不停的向外发数据,该怎么才能只发一次?已经试了多种方法,仍然没有解决。查询法和中断法都没有想出解决办法。
主要问题集中在只要SBUF中写入一个数据,就会导致串口不停的向外发送此数据,应该是在不停的执行主函数,形成了死循环。可是如果每次程序都是从头到尾执行的话,SBUF必然要发出数据的。我用中断法设置标签flag作为发送数据的标志,试图使程序只执行一次,失败了。 可在程序结尾加 while(1); //使程序停在此处,虽然这样程序只执行了一次,但是这样就无法动态更新数据。请教高手解决此问题!谢谢!
main()
{
init(); //初始化函数
capture(); //ad采集函数
SBUF=value; //value是从ad采集来的数据,通过串口发给上位机
while(!TI);
TI=0;
}

我想楼主的意思应该是实时更新AD采集到的数据并传送到上位机吧。

我的理解是楼主所指芯片是下位机,并且只做下位机的发送工作,那么可以用标志位的方法限定发送状态。

我的一个想法:

首先设定是否全局发送标志位IfSendAdValue(这个可以设定为位变量,节省内部RAM),这里假设0代表不发送,1代表发送。

主程序main中用while循环不断比对IfSendAdValue是否为1,等于1执行发送程序Send(),等于0继续比对。

Send()函数中让IfSendAdValue等于0,表示一次发送后禁止再次发送Ad数据。

第一种、利用IO口线做一个端口按键,控制IfSendAdValue为1,表示只要端口按键响应,便发送一次Ad数据。

第二种、通过上位机回送一个应答信号,原理同IfSendAdValue。

主程序:
void main(void)
{
Ini_Uart();
while(1)
{
GetAdValue();//将Ad采样放在主循环中,表示不断采样,但不一定发送,这样保证了Ad值的实时性。
if(IfSendAdValue)
Send();
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-14
首先要弄明白的是单片机的程序都是一个死循环,从头走到尾,在回去来一遍,要实现更新可以采用定时器隔一段时间起动才集并通过串口发,定义一个变量,定时到使值为1,主程序判断是1才起动转换,发送,完事后变量赋0就可以了,最好学一下陈明计的small rtos51,这样解决更方便

参考资料:如果您的回答是从其他地方引用,请表明出处

相似回答