音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

請(qǐng)教串口中斷發(fā)送不正確

作者:robinsun 欄目:單片機(jī)
請(qǐng)教串口中斷發(fā)送不正確
mega32單片機(jī),winavr編譯。
串口發(fā)送數(shù)據(jù)不正確,具體看main函數(shù)。發(fā)送數(shù)據(jù)前先判斷是否發(fā)送完成了,然后放入需要發(fā)送的數(shù)據(jù)。我期望是得到runbadGOOD這3個(gè)字符串,可是串口接收到的是rbood。增加volatile修飾也不行。

#include <avr/io.h>
#include <avr/Interrupt.h>
#include <avr/signal.h>
#include  <string.h>
#include  <stdlib.h>


#define   OWN_ADDRESS      1
#define   LEAD_OK          0x55
#define   LENGTH_OK        0xaa
#define  REC_LENGTH 10
#define TXD_LENGTH 10

struct
{
  unsigned CHAR   Buffer[REC_LENGTH];
  unsigned CHAR   ucLeadOK,Receiving;
  unsigned CHAR   Leading,LengthOK,Length,Counter,CHECKSUM;   
}  Rec;


struct
{
  unsigned CHAR   Buffer[TXD_LENGTH];   
  unsigned CHAR   Length,Counter,CHECKSUM,Sending;   
} volatile Txd;

volatile unsigned CHAR SSS;

void PutString(unsigned CHAR  *p)
{
    Txd.Counter = 1;         
    Txd.Length = 3;//strlen(p);
    strcpy(Txd.Buffer,p);
    UDR = *p;    
}

SIGNAL (SIG_UART_RECV)            // receive interrupt
{   
}                      
                  
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// CHAR size: 8 bit
// parity: Disabled
void UART_Init(void)
{  
   UCSRA &= ~(1<<U2X);                       
   UCSRC &= ~(1<<URSEL);             // SELECT UBRRH;
   //UBRRL = (FOSC/16/(BAUD+1))%256;
   //UBRRH = (FOSC/16/(BAUD+1))/256;    
   UBRRL = 0x0C; //set baud rate lo4800
   UBRRH = 0x00; //set baud rate hi
   UCSRB = (1<<TXCIE)|(1<<RXCIE)|(1<<RXEN)|(1<<TXEN) ; //|(1<<UCSZ2); //允許發(fā)送和接收,允許接收中斷,8bit
   UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位數(shù)據(jù)+1位STOP位        
}



////////////////////////////////////////
SIGNAL (SIG_UART_TRANS)              // transmit interrupt
{
    if(Txd.Length--)
    {
        UDR = Txd.Buffer[Txd.Counter];
        Txd.Counter++;
        Txd.Sending = 1;
    }
    else
    {
        SSS=0;
        Txd.Sending = 0;
    }
}


int main(void)
{    
    unsigned LONG t;    
  UART_Init();
  Txd.Sending = 0;
  sei();
  PutString("GOOD");
  for(t=0;t<65530;t++);
  while(1)
  {
      //if(Txd.Length == 1)
      //cli();
      PutString("run");
      while(Txd.Sending == 1);//一直等待發(fā)送完成
      PutString("bad");
      while(Txd.Sending == 1);//一直等待發(fā)送完成
      PutString("GOOD");
      for(t=0;t<65530;t++);  
  }
}

2樓: >>參與討論
robinsun
解決
將發(fā)送中斷里面的if(Txd.Length--)
修改為if(--Txd.Length) 就好了,網(wǎng)上的程序只能參考,還是要仔細(xì)分析.


參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)各位老師幫忙解決Mega16控制180V/5A直流電機(jī)調(diào)速問(wèn)題
新手求教:C語(yǔ)言怎么實(shí)現(xiàn)往R16寄存器里放數(shù)據(jù)?
AVR32什么時(shí)間推出啊?
51中的模擬I2C程序可以修改后在avr中引用嗎?
AVR能實(shí)現(xiàn)遠(yuǎn)程升級(jí)程序嗎?如果能的話(huà)如何操作?
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)