Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
今天在UART與GPS連接後,run程式
用watch看U1STA的Value為0xC544(若沒連接Value則為0xC550) 16近位轉換後為'1100 0101 0100 0100'(若沒連接則為'1100 0101 0101 0000') 發現 bit0 為'0',0 = Receive buffer is empty bit0 為'1',1 = Receive buffer has data, at least one more character can be read bit2 為'1',1 = Framing error has been detected for the current character (character at the top of the receive FIFO) bit2 為'0',0 = Framing error has not been detected bit4 為'0',0 = Receiver is active bit4 為'1',1 = Receiver is Idle 我的包率明明有設對(4800),我還有用其他包率測試過2400、9600、19200 其他包率 用watch看U1STA的Value為0xC554(UART與GPS連接) 16近位轉換後為'1100 0101 0101 0100' bit4 為'1',1 = Receiver is Idle 所以我的包率有設對!! 我想請問bit2 為'1'的可能性有哪些??有什麼解決方法??
發表於: 2009/9/25 19:09
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
TO cct1210兄:
我有用示波器測量,只有RX腳位有訊號 訊號是+5V/-5V 上下跳 應該就是你所說的 要先使用Transceiver轉換後才能與PIC24FJ溝通吧!? 是嗎?? 非常感謝你的經驗相談~~讓我又學到東西!!再次感謝妳~
發表於: 2009/9/24 23:18
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
不曉得你是否有用示波器量一下GPS的TX腳位,看看有沒有輸出?
我使用過兩款GPS,第一種訊號的輸出位準為+/-5V,所以要使用Transceiver轉換後與PIC24FJ溝通,而且要先從PIC24FJ的RS232下一個起始命令後,GPS才開始每一秒傳一串資料回來;另外一款輸出位準為0/5V,直接接到PIC24FJ即可,且此型GPS會一直傳字串回來,不需要下命令,所以我就將接收的buffer開大一點,接收超過2秒的字串資料,然後再從字串中找'$'字元,來判斷起始的GPS資料,再解碼. 希望我的經驗對你有幫助.
發表於: 2009/9/24 22:15
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
我將程式改成
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) // UART1接收資料中斷副程式 { IFS0bits.U1RXIF = 0 ; // 清除中斷旗標 RX_DATA = ReadUART1(); // Get RS-232 data 將UART讀取資料暫存器的內容讀出 UART_RX_Flag = 1 ; } int main(void) { while(1) { if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標 { RX_ARRAY[cnt]=RX_DATA; LCD_SetCursor(0,1); putsLCD(RX_ARRAY); UART_RX_Flag = 0 ; cnt=0; } } } -------------------------------------------------------------------- 結果 watch中 RX_DATA 最常出現的 Value = 0x00 or 0xF8 RX_ARRAY 的 Value 還是為 "." LCD上顯示"X" 至於你說的LooKRS232 我下載了 File -> Connection -> 設定好 com1,4800,8,1,None,None -> OK 結果 Serial port 'COM1' was successfully opened with selected settings Serial port 'COM1' is accessible for using 接著就沒東西 Serial Satatus 中 每一個都是off .... 不曉得 lancer0498 兄願不願意留個e-mail or MSN 做個交流?
發表於: 2009/9/24 20:18
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
我編譯時 出現error在 putsLCD(RX_ARRAY[]);
我改成 putsLCD(RX_ARRAY[cnt]); 編譯通過 但實行結果 LCD沒顯使任何東西 將中斷點設在putsLCD(RX_ARRAY[cnt]); 不能中斷 因此判斷RX_DATA=='*' => false ------------------------------------------------------------------- 不好意思,請改為如下 putsLCD(RX_ARRAY); 你可以用watch看一下你收的時後RX_DATA有沒有東西, 如果有只要把資料正確的放入RX_ARRAY然後顯示,應該是可以才對,用watch看的時候記得斷點設在已收到RX_DATA以後, 另外我測試時都是先以PC送資料給PIC,然後顯示在LCD上, 這樣才能確定你將資料收進來後丟到LCD顯示是否寫對! 你可用LOOKRS232這個軟體來使用,上網抓一下吧
發表於: 2009/9/24 17:02
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
參照:
感謝lancer0498兄的意見~~!! 我編譯時 出現error在 putsLCD(RX_ARRAY[]); 我改成 putsLCD(RX_ARRAY[cnt]); 編譯通過 但實行結果 LCD沒顯使任何東西 將中斷點設在putsLCD(RX_ARRAY[cnt]); 不能中斷 因此判斷RX_DATA=='*' => false 會是我本身GPS有問題嗎??
發表於: 2009/9/24 16:24
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
以下是臨時寫的,沒經測試,可以參考看看
void RX_isr(void) { PIR1bits.RCIF=0; RX_DATA=ReadUSART(); FLAGbits.RX=1; } void main() { unsigned char cnt=0; ... ... . . . . while(1) { if(FLAGbits.RX==1) { RX_ARRAY[cnt]=RX_DATA; if(RX_DATA=='*') //收到checksum前的*號 //checksum可不必理它,除了你一定要用到 { putsLCD(RX_ARRAY[]); FLAGbits.RX=0; cnt=0; } else { cnt++; FLAGbits.RX=0; } } } } /*我是讀電機的,也沒人教,也是從microchip論壇問來的, 希望我們互相交流,可以讓我們這些能力不好的小朋友成長,加油*/
發表於: 2009/9/24 8:45
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
非常感謝lancer0498兄給的意見,你的意見讓我學到不少!!再次感謝妳!!!
$GPRMC,171216.000,A,4139.6583,N,08336.5562,W,7.87,300.93,071207,,*1C == > 這應該是代表$是斷落的開始吧!? 經過我一天的修改 還是沒辦法.... 我在 int main(void) { LCD_Delay200usX(50) ; PMP_Initial() ; ADC_Initial() ; Timer1_Initial(); OC_Initial() ; UART1_Initial() ; LCD_Initial() ; LCD_SetCursor(2,0); putrsLCD(LCDString); while(1) { if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標 { RX_BuffDisplay(RX_Buff); UART_RX_Flag = 0 ; ==>設中斷點 } } ==> 中斷後 指標所指位置 } 第一次中斷 watch觀看結果是 cnt = 0x007,RX_Buff 全部都是.或x,UART_RX_Flag = 0x00 在執行一次後中斷 watch觀看結果是 cnt = 0x009,RX_Buff 全部都是.或x,UART_RX_Flag = 0x00 lancer0498兄可不可以請妳再詳細說明,我有點不太懂你的意思...很抱歉,我是學通訊網路出身的,對於這個不太懂,有勞你多多指點!! =============主要程式============ void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) // UART1接收資料中斷副程式 { IFS0bits.U1RXIF = 0 ; // 清除中斷旗標 RX_Buff[cnt]=ReadUART1(); // Get RS-232 data 將UART讀取資料暫存器的內容讀出 if (cnt < 17) { cnt++ ; } else { cnt = 0 ; 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); putrsLCD(LCDString); while(1) { if(UART_RX_Flag == 1) // 判斷資料傳送狀態旗標 { RX_BuffDisplay(RX_Buff); UART_RX_Flag = 0 ; } } } void RX_BuffDisplay(unsigned char *buff) { LCD_SetCursor( 0,1); LCD_Delay200usX(50) ; putsLCD(buff) ; LCD_Delay200usX(50) ; } Attach file: ![]() Link only for registered users
發表於: 2009/9/24 0:02
|
|||
|
Re: 請教GPS To Uart Receive By PIC24F
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
看了你在最上面的程式,你好像沒有把收進來的資料處理好,
因為gps送出的資料是一大堆,每送一個字你就進入中斷一次, 但是看你的RX_BUFF[CNT]都沒去變動,我之前幫學弟寫過GPS範例的時後,好像也發生過這樣的問題,記得是在資料接收做好之後才沒問題的,另外你可以經由判斷'$'的方式來作段落,記得GPS好像每格協定的結尾是'$',你可以試一下,祝你成功!
發表於: 2009/9/23 8:27
|
|||
|