|
我已经找到原因了,虽然你说的不对,但还是很谢谢你!原因是我在write_data函数中把send_length定义成了静态变量。它的值只能被初始化一次,当第一次发送完成后,它的值就永远为0了。
#define _UART_C
#include "includes.h"
static void write_data(void);
static INT8U send_length = 0; //这里把要发送的数据的长度定义为静态变量,
//用它来判断是否发送完,它的值在send_data函数中被赋值
//每次发送完一个字节,后在write_data中减一
/****************************************
串口初始化 9600bps 8bit 1stop
****************************************/
void Init_UART(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00;
SCON=0x50;
TR1=1;
ET1=0;
ES=1;
}
//串口发送十六进制数据
//num:要发送的数据的个数 *str:数据数组的首地址
//应用层调用此函数把要发送的数据写入发送缓冲器中。
void UART_SendData(unsigned char num,unsigned char *str)
{
INT8U i;
for(i=0;i
{
SendBuf=str;
}
send_length = i;
write_data(); //调用发送数据的函数
}
//串口发送字符串
void UART_SendString(unsigned char *str)
{
INT8U i=0;
while(str!='\0')
{
i++;
}
UART_SendData(i+1,str);
}
static void write_data(void)
{
static INT8U send_head=0;
if(send_length == 0) //如果无数据发送,就退出
{
//关闭串口中断
TI=0;
send_head=0;
// flag_uart = 0;
//发送信号量
OSSemPost(Sem_UART);
return;
}
else
{
send_length--;
// flag_uart = 1;
SBUF = SendBuf[send_head++];
}
}
/****************************************
串口接收中断
****************************************/
void UART_Receive(void) interrupt 4
{
OS_ENTER_CRITICAL();
OSIntNesting++;
OS_EXIT_CRITICAL();
if(RI)
{
RI=0;
ReceiveBuf[length++]=SBUF; //接收串口数据
}
if(TI) //如果是发送中断
{
TI=0; //清除中断标志位
write_data(); //调用发送函数
}
OSIntExit();
} |
|