Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
本人以成功截取到GPS訊號
再次感謝所以觀看及回復我問題的人 將此檔案放在網路上供給需要的人做參考 GPS To Uart Receive By PIC24FJ218GB106 Attach file: Link only for registered users
發表於: 2009/10/7 23:34
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
以這個函式來看,這一行的寫法應該是錯的。
因為函式的原型是以字元指標為引數,但是您呼叫它時給它的卻是字元(不是字元陣列) putsLCD(RX_ARRAY[0]); 我認為應該改成 putsLCD(RX_ARRAY);//<--這樣才是對的 另外這個函式是以判斷\0為停止條件 所以您傳給這個函式必需是字串(就是字元陣列後面要加\0)而不是字元陣列,不然如果這個字元陣列都以後的記憶體空間裡都沒有\0的話,那就沒完沒了了。 參照:
發表於: 2009/10/7 9:01
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
TO : biko兄
很感謝妳回覆我的問題!! putsLCD(RX_ARRAY[0]) ;<--這一行Compile可以過!! putsLCD()函式 void putsLCD(unsigned char *TheString) { while( *TheString != 0x00 ) { while ( LCD_IsBusy()) ; LCD_PutChar(*TheString++ ) ; } }
發表於: 2009/10/5 20:23
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
while(1)
{ if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標 { RX_ARRAY[cnt] = RX_DATA ; UART_RX_Flag = 0;//<--要放這裡 if(cnt = 15) { LCD_Delay200usX(50) ; LCD_SetCursor( 0,1); LCD_PutChar(RX_ARRAY[0]) ; putsLCD(RX_ARRAY[0]) ;<--這一行Compile能過哦? LCD_Delay200usX(300) ; cnt = 0 ; } else { cnt++; //UART_RX_Flag = 0;<--不應該放這裡 } } } PS.字串是一種字元陣列,但是字元陣列不一定是字串,我不知道putsLCD()這個函式是怎麼寫的,但是您要注意一下…RX_ARRAY[]是否有'\0'
發表於: 2009/10/2 17:26
|
|||
我相信解決問題的方法不只一種,所以我在回答同好的問題時或者提出與主題不同的方案,
請不要以此做為攻擊的目標,畢竟我也只是想和大家討論如何解決問題而已… 解決問題最重要,..... |
||||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
再請教一個問題....
我使用 ReadUART1 Function This function returns the contents of Receive buffer (UxRxREG) register 我用watch 觀看 U1RXREG 值為 0x009D 但經過 unsigned char RX_DATA ; RX_DATA = ReadUART1() ; 用watch 觀看 RX_DATA 值為 0x71 請問2個byte(U1RXREG)給到1個byte(char)這是如何換算解碼的?? 若 U1RXREG 值為 0x009D 經過 short int RX_int ; RX_int = ReadUART1() ; 用watch 觀看 RX_int 值為 0x0093 請問2個byte(U1RXREG)給到2個byte(short int) 照道理說 他們值應該會是一樣的不是嗎??
發表於: 2009/10/2 14:08
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
經過我修改檢查後
已經可以接收到資料,U1STA的bit2 為'0',0 = Framing error has not been detected 我想請問 LCD_PutChar(RX_ARRAY[0]); 執行結果為亂碼一直變跟(但有規律) putsLCD(RX_ARRAY[0]) ; 執行結果為DDdB 有時會變成DDDD 明明就是同一個value 為什麼顯示出來會差很多?? =============程式大致如下================= #include <p24FXXXX.h> #include "lcd.h" #include <timer.h> #include <adc.h> #include <outcompare.h> #include <pps.h> #include <uart.h> #include <stdio.h> _CONFIG2(IESO_OFF & POSCMOD_HS & FNOSC_PRI& FCKSM_CSDCMD & PLLDIV_DIV2 ) _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF ) void UART1_Initial(void) ; void OC_Initial(void) ; #define INPUT 1 #define OUTPUT 0 #define Ctrl_U1RX TRISFbits.TRISF5 #define Ctrl_U1TX TRISFbits.TRISF3 unsigned char LCDString[] = "GPS Receive"; unsigned int ADC_TempValue ; unsigned char RX_DATA,RX_ARRAY[16],LineCount = 0 ; unsigned char cnt=0; unsigned int Timer1Tick = 0,i = 0 ; unsigned int RPM = 0 ; unsigned UART_Timer = 0 ; unsigned char UART_RX_Flag = 0 ; void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) // UART1接收資料中斷副程式 { IFS0bits.U1RXIF = 0 ; // 清除中斷旗標 RX_DATA = ReadUART1(); // Get RS-232 data 將UART讀取資料暫存器的內容讀出 UART_RX_Flag = 1 ; } void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void) { IFS0bits.T1IF = 0 ; Timer1Tick = 1 ; } int main(void) { LCD_Delay200usX(50) ; PMP_Initial() ; ADC_Initial() ; Timer1_Initial(); OC_Initial() ; UART1_Initial() ; LCD_Initial() ; LCD_SetCursor(2,0); putsLCD(LCDString); while(1) { if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標 { RX_ARRAY[cnt] = RX_DATA ; if(cnt = 15) { LCD_Delay200usX(50) ; LCD_SetCursor( 0,1); LCD_PutChar(RX_ARRAY[0]) ; putsLCD(RX_ARRAY[0]) ; LCD_Delay200usX(300) ; cnt = 0 ; } else { cnt++; UART_RX_Flag = 0; } } } } void OC_Initial(void) { PR2 = 4096 ; T2CON = 0x8000 ; OC1CON1 = 0x000e ; OC1CON2 = 0x001f ; OC1R = 0 ; OC1RS = 1023 ; // Set RP2 as OC1 output !! // RP2 @ RD8 TRISDbits.TRISD8 = OUTPUT ; iPPSOutput(OUT_PIN_PPS_RP2,OUT_FN_PPS_OC1); } void UART1_Initial(void) { // Important system variable -> "__C30_UART" // 1 = UART1 // 2 = UART2 if using printf to output data to "stdout" unsigned int U1MODEvalue; unsigned int U1STAvalue; // **************************************************** // 設定 UART1 RX = RP10 -> Pin31 // 設定 UART1 TX = RP17 -> Pin32 // **************************************************** PPSUnLock ; CloseUART1(); ConfigIntUART1(UART_RX_INT_EN & UART_RX_INT_PR6 & UART_TX_INT_DIS & UART_TX_INT_PR2); iPPSInput(IN_FN_PPS_U1RX,IN_PIN_PPS_RP10); iPPSOutput(OUT_PIN_PPS_RP17,OUT_FN_PPS_U1TX); U1MODEvalue = UART_EN & UART_IDLE_STOP & UART_EN_WAKE & UART_DIS_LOOPBACK & UART_DIS_ABAUD & UART_NO_PAR_8BIT & UART_1STOPBIT & UART_IrDA_DISABLE & UART_UEN_00 & UART_BRGH_SIXTEEN; U1STAvalue = UART_INT_TX_BUF_EMPTY & UART_SYNC_BREAK_DISABLED & UART_TX_ENABLE & UART_INT_RX_CHAR & UART_ADR_DETECT_DIS & UART_RX_OVERRUN_CLEAR; // ********************************************************** // 設定 UART 為 4800 bps // CPU Fosc = 8 Mhz -> Fcy = 4Mhz // ********************************************************** OpenUART1 ( U1MODEvalue , U1STAvalue , 51 ) ; //ConfigIntUART1(UART_RX_INT_EN & UART_TX_INT_EN) ; Ctrl_U1RX = INPUT ; Ctrl_U1TX = OUTPUT ; PPSLock ; }
發表於: 2009/10/2 9:30
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
其實要注意的是你的信號是跑TTL信號還是RS232信號
然後根據信號看是否須MAX232作處理 可參考五南書局 黃東正寫的書 裡面有介紹GPS的部份
發表於: 2009/9/26 11:08
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
參照:
cct1210兄 你是對的!! 我量DB-2的訊號是+5V/-5V 上下跳 但經過MAX232轉換後訊號為0/5V上下跳!!
發表於: 2009/9/26 9:38
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
參照:
我有點困惑,理論上應該是GPS的TX有+5/-5V的訊號變化,然後經過Transceiver後,在PIC24的RX接腳有0/5V的訊號變化. 所以你的RX腳位有訊號,訊號是+5V/-5V 上下跳,有點奇怪,你要不要量一下PIC24的RX接腳呢?
發表於: 2009/9/25 20:44
Edited by cct1210 on 2009年09月25日 21:14:02
|
|||
|