|
|||||||||||
| 技術(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ī) |
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 于 2006/4/2 17:45:00 發(fā)布:
解決 將發(fā)送中斷里面的if(Txd.Length--) 修改為if(--Txd.Length) 就好了,網(wǎng)上的程序只能參考,還是要仔細(xì)分析. |
|
| 免費(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) |