|
本想发送一组数据,可是只能发送数组中的第一个数,
如:定义一组数据unsigned char Tab[]={0x01,0x10,0x00,0x01,0x00,0x02,0x04,0x00,0x0A,0x01,0x02,0xE2,0x37};
可是只能发送第一个。。。。麻烦帮忙看看程序哪里有问题????
#include<iom16v.h>
#include<macros.h>
#define UART_BUF_SIZE 16 //UART数据缓冲区长度定义
unsigned char SendBuffer[UART_BUF_SIZE];//发送缓冲区
unsigned char RecvBuffer[UART_BUF_SIZE];//接收缓冲区
unsigned char Tab[]={0x01,0x10,0x00,0x01,0x00,0x02,0x04,0x00,0x0A,0x01,0x02,0xE2,0x37};
#pragma data:data
/***************************************************************/
//队列数据结构
typedef struct Queues
{
unsigned char in_index;//入队地址
unsigned char out_index;//出队地址
unsigned char buf_size; //缓冲区长度
unsigned char *pBuffer;//缓冲
volatile unsigned char data_count; //队列内数据个数
}HQueue,*PHQueue;
HQueue H_SendQueue;//发送队列句柄
HQueue H_RecvQueue;//接收队列句柄
void QueueInput(PHQueue Q,unsigned char dat)//向队列写入一字节
{
if(Q->data_count<Q->buf_size )
{
Q->pBuffer[Q->in_index]=dat;//写入数据
Q->in_index=(Q->in_index+1)%(Q->buf_size);//调整入口地址
Q->data_count++; //调整数据个数
}
}
unsigned char QueueOutput(PHQueue Q)//从队列读出一字节
{
unsigned char cData;
if(Q->data_count > 0 )
{
cData=Q->pBuffer[Q->out_index];
Q->out_index=(Q->out_index+1)%(Q->buf_size);//调整入口地址
Q->data_count--;//调整数据个数
}
return cData;
}
unsigned char QueueGetDataCount(PHQueue Q)//获得队列中数据个数
{
return Q->data_count;
}
void QueueClear(PHQueue Q) //清空队列
{
Q->in_index=0;
Q->out_index=0;
Q->data_count=0;
}
void QueueCreate(PHQueue Q,unsigned char *buffer,unsigned char buf_size)//初始化一队列
{
Q->pBuffer=buffer;
Q->buf_size=buf_size;
QueueClear(Q);
}
/******************************************************************/
/**************************************************************/
#pragma interrupt_handler uart0_rx_isr:12 //接收中断
void uart0_rx_isr(void)
{
unsigned char c;
c=UDR;
QueueInput(&H_RecvQueue,c);
}
#pragma interrupt_handler uart0_udre_isr:13 //发送寄存器空中断
void uart0_udre_isr(void)
{
if(QueueGetDataCount(&H_SendQueue)>0)
{
UDR=QueueOutput(&H_SendQueue);
}
else
UCSRB&=~(1<<UDRIE);
}
/*********************************************************************/
void UART_Init(void)
{
UCSRA=0x00;
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位 无校验 1停止位
UBRR=25; //9600 4MHZ
QueueCreate(&H_SendQueue,SendBuffer,UART_BUF_SIZE);
QueueCreate(&H_RecvQueue,RecvBuffer,UART_BUF_SIZE);
}
unsigned char UART_recv(unsigned char *buf)//读接收缓冲内的数据
{
unsigned char Len;
for(Len=0;Len<UART_BUF_SIZE;Len++)
{
if(QueueGetDataCount(&H_RecvQueue)==0)
break;
else
buf[Len]=QueueOutput(&H_RecvQueue);
}
return Len; //返回实际接收的长度
}
void UART_send(unsigned char *buf,unsigned char len)//发送指定长度的数据
{
unsigned char i;
CLI();
QueueClear(&H_SendQueue);
for(i=0;i<len;i++)
{
QueueInput(&H_SendQueue,buf);
}
// UDR=QueueOutput(&H_SendQueue);
UCSRB|=(1<<UDRIE); //数据空中断允许
SEI();
}
void main(void)
{
UART_Init();
SEI();
while(1)
{
UART_send(Tab,13);
}
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|