|
发表于 2009-7-20 17:09:05
|
显示全部楼层
可以这样改,假设发送的数据帧,第一个\第二个是真同步头55H,AAH,第三个是地址,后面是数据.如下:知道发送的总数,比如发送512个来说(从SD卡读来)
interrupt [USART_TXC] void usart_tx_isr(void)
{
static g=0;
g++;
if(g==2) UCSR0B|=_BV(TXB8); 前面2个为桢头发送完成,立即转为地址标志,第三个开始为地址。
else if(g==3) USR0B&=~_BV(TXB8); 地址数据发送完成,转为数据标志。后面都是数据
if (g==512) g=0;
if (tx_counter) //发送队列中还有为发送的数据
{
--tx_counter; //发送一个数据, 队列先进先出环形队列
UDR=tx_buffer[tx_rd_index]; //读指针读向下一个未发送数据
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0; //如果直到队列尾部,回到队列头部
}
}
void putchar_485(char c)
{
while (tx_counter == TX_BUFFER_SIZE); //如果发送队列满,则等待
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0)) //前面还有未发送的数据和未发完的数据
{
tx_buffer[tx_wr_index]=c; //数据放入队列排队
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0; //调整写指针
++tx_counter; //发送数据加1
}
else
UDR=c; //队列无待发送数据或者发送寄存器空,直接发送
#asm("sei")
} |
|