xiaowang123 发表于 2009-7-18 21:53:36

请教马老师和网友一个问题。

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通信方式,如果我要体现发送时地址和数据差别,在这端程序里,如何体现?谢

machao 发表于 2009-7-19 11:46:34

请参考我编写的《AVR单片机嵌入式系统原理与应用实践》一书中关于USART通信以及多机通信方面的介绍

xiaowang123 发表于 2009-7-19 12:46:07

您好,马老师,你这本书我买了。不然我怎么知道你的名字。
这段程序能否加入地址和数据判断?

machao 发表于 2009-7-19 13:10:58

你仔细参考学习了我介绍的多机通信方法吗?首先建议采用我书上的方法,比采用第9位表示地址还是数据的要好,和方便。

上面的代码是通用的方法,不适合加入地址和数据判断。如果一定要采用地址和数据第9位的方法,代码改动还是比较大的。

liao_liao 发表于 2009-7-20 17:09:05

可以这样改,假设发送的数据帧,第一个\第二个是真同步头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")
}

liao_liao 发表于 2009-7-20 17:16:23

上面512包括一个地址、N个数据、2个同步头

xiaowang123 发表于 2009-7-21 09:30:46

有没有人验证过?

liao_liao 发表于 2009-7-21 10:34:48

问问马老师,就知道了。

xiaowang123 发表于 2009-7-21 19:39:17

感觉这个网站真才比较少,我问这么简单的问题,就一个人回答,还叫我去找麻辣是验证。其他人难道都不懂这么程序?

machao 发表于 2009-7-21 20:24:57

没有万能的程序,重要的是独立的思考和认真的学习。

如果你不懂,你怎么知道你问的是“简单的问题”?如果你知道是个“简单的问题”,那么说明你已经懂了,那还有必要问么?
页: [1]
查看完整版本: 请教马老师和网友一个问题。