请教马老师和网友一个问题。
interrupt void usart_tx_isr(void){
if (tx_counter) //发送队列中还有为发送的数据
{
--tx_counter; //发送一个数据, 队列先进先出环形队列
UDR=tx_buffer; //读指针读向下一个未发送数据
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=c; //数据放入队列排队
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;//调整写指针
++tx_counter; //发送数据加1
}
else
UDR=c;//队列无待发送数据或者发送寄存器空,直接发送
#asm("sei")
}
上面的USART通信方式,如果我要体现发送时地址和数据差别,在这端程序里,如何体现?谢 请参考我编写的《AVR单片机嵌入式系统原理与应用实践》一书中关于USART通信以及多机通信方面的介绍 您好,马老师,你这本书我买了。不然我怎么知道你的名字。
这段程序能否加入地址和数据判断? 你仔细参考学习了我介绍的多机通信方法吗?首先建议采用我书上的方法,比采用第9位表示地址还是数据的要好,和方便。
上面的代码是通用的方法,不适合加入地址和数据判断。如果一定要采用地址和数据第9位的方法,代码改动还是比较大的。 可以这样改,假设发送的数据帧,第一个\第二个是真同步头55H,AAH,第三个是地址,后面是数据.如下:知道发送的总数,比如发送512个来说(从SD卡读来)
interrupt 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; //读指针读向下一个未发送数据
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=c; //数据放入队列排队
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;//调整写指针
++tx_counter; //发送数据加1
}
else
UDR=c;//队列无待发送数据或者发送寄存器空,直接发送
#asm("sei")
} 上面512包括一个地址、N个数据、2个同步头 有没有人验证过? 问问马老师,就知道了。 感觉这个网站真才比较少,我问这么简单的问题,就一个人回答,还叫我去找麻辣是验证。其他人难道都不懂这么程序? 没有万能的程序,重要的是独立的思考和认真的学习。
如果你不懂,你怎么知道你问的是“简单的问题”?如果你知道是个“简单的问题”,那么说明你已经懂了,那还有必要问么?
页:
[1]