|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
請教ZLGSmartARM2200的基于UCOSII串口附帶實驗問題 |
| 作者:狙外一槍 欄目:ARM技術(shù) |
實驗光盤的基于UCOS的串口接收程序,為什么只能一次接收16個字節(jié)以內(nèi)的數(shù)據(jù)。如果一次從PC串口發(fā)送超過16個字節(jié),16個之后的數(shù)據(jù)就丟掉了,誰知道為什么?我是在任務(wù)中循環(huán)調(diào)用函數(shù):uint8 UART0Getch(void);附帶光盤上的串口部分程序,文件uart0.c : #define IN_UART0 #include "config.h" static int UART0SendBuf[(UART0_SEND_QUEUE_LENGTH + sizeof(int) - 1) / sizeof(int)]; static OS_EVENT *Uart0Sem; uint8 UART0Init(uint32 bps) { uint16 Fdiv; PINSEL0 = (PINSEL0 & 0xfffffff0) | 0x05; /* 選擇管腳為UART0 */ U0LCR = 0x80; /* 允許訪問分頻因子寄存器 */ Fdiv = (Fpclk / 16) / bps; /* 設(shè)置波特率 */ U0DLM = Fdiv / 256; U0DLL = Fdiv % 256; U0LCR = 0x03; /* 禁止訪問分頻因子寄存器 */ /* 且設(shè)置為8,1,n */ U0IER = 0x05; /* 允許接收和發(fā)送中斷 */ U0FCR = 0x87; /* 初始化FIFO */ if (QueueCreate((void *)UART0SendBuf, sizeof(UART0SendBuf), NULL, (uint8 (*)())Uart0WriteFull) == NOT_OK) { return FALSE; } Uart0Sem = OSSemCreate(0); if (Uart0Sem != NULL) { return TRUE; } else { return FALSE; } } uint8 UART0Getch(void) { uint8 err; OS_ENTER_CRITICAL(); while ((U0LSR & 0x00000001) == 0) { /* 沒有收到數(shù)據(jù) */ U0IER = U0IER | 0x01; /* 允許接收中斷 */ OSSemPend(Uart0Sem, 0, &err); /* 等待接收數(shù)據(jù) */ } err = U0RBR; /* 讀取收到的數(shù)據(jù) */ OS_EXIT_CRITICAL(); return err; } void UART0_Exception(void) { uint8 IIR, TEMP, i; OS_ENTER_CRITICAL(); while(((IIR = U0IIR) & 0x01) == 0) { /* 有中斷未處理完 */ SWITCH (IIR & 0x0e) { case 0x02: /* THRE中斷 */ for (i = 0; i < UART0_FIFO_LENGTH; i++) /* 向發(fā)送FIFO填充數(shù)據(jù) */ { if (QueueRead(&TEMP, UART0SendBuf) == QUEUE_OK) { U0THR = TEMP; } else { U0IER = U0IER & (~0x02); /* 隊列空,則禁止發(fā)送中斷 */ } } break; case 0x04: /* 接收數(shù)據(jù)可用 */ OSSemPost(Uart0Sem); /* 通知接收任務(wù) */ &nbs |
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |