在序列通訊中,很難判斷幀標誌,常用的方法是定長、結束符等方法。定長就是約定好協議字元位元組長度,當收到所有位元組後開始處理,但是這種方法不適用於不定長的通訊。結束符就是約定一定的字元作為判斷通訊結束的標誌,比如常用的回車換行符,0d 0a,但是這種方法會浪費通訊資源。
下面介紹一種以時間間隔判斷幀,和人說話一樣,當一句話說完會進行停頓,這時判斷停頓的時間,當一定時間內沒有收到資料,就把前面這段時間的資料進行處理。這種方法在modbus通訊協議中應用較為廣泛。
本例程的開發板是普中的pz-dsp28335-l開發板,串列埠為sci-a,定時器為timer0。
對串列埠進行初始化,配置sci-a的波特率,工作方式,使能中斷,配置接收中斷服務子函式。
定義好傳送字元、字串的函式,還有清除接收buffer的函式,方便呼叫。
在中斷服務子函式中,對接收到的資料進行儲存到buffer,如果是接收的第乙個位元組,需要開啟定時器開始計時。
unsigned char usart2_rx_buf[usart2_max_recv_len]; //接收緩衝,最大usart2_max_recv_len個位元組.
unsigned char usart2_tx_buf[usart2_max_send_len]; //傳送緩衝,最大usart2_max_send_len位元組
volatile uint16 usart2_rx_sta=0; //接收資料狀態
void uarta_init(uint32 baud)
void resetrxbuf(void)
usart2_rx_buf[usart2_rx_sta]=data; //記錄接收到的值
usart2_rx_sta++;
}else
}sciaregs.sciffrx.bit.rxffovrclr=1; // clear overflow flag
sciaregs.sciffrx.bit.rxffintclr=1; // clear interrupt flag
piectrlregs.pieack.all |= pieack_group9; // issue pie ack
}
#ifndef uart_h_
#define uart_h_
#include "dsp2833x_device.h" // dsp2833x 標頭檔案
#include "dsp2833x_examples.h" // dsp2833x 例子相關標頭檔案
#define usart2_max_recv_len 400 //最大接收快取位元組數
#define usart2_max_send_len 400 //最大傳送快取位元組數
#define uart_autobaun_test
extern unsigned char usart2_rx_buf[usart2_max_recv_len]; //接收緩衝,最大usart2_max_recv_len位元組
extern unsigned char usart2_tx_buf[usart2_max_send_len]; //傳送緩衝,最大usart2_max_send_len位元組
extern volatile uint16 usart2_rx_sta; //接收資料狀態
void resetrxbuf(void);
void uarta_init(uint32 baud);
void uarta_sendbyte(int a);
void uarta_sendstring(unsigned char * msg);
interrupt void sciarxfifoisr(void);
#endif /* uart_h_ */
配置定時器為10ms,時間間隔可以根據需求進行更改,一般是3個字元通訊時間以上。配置好定時器後,不要開啟定時器,由串列埠接收到第乙個位元組資料後開啟定時器。
在定時器中斷服務函式中,直接對接收完成標誌進行置位。
#include "dsp2833x_device.h" // dsp2833x 標頭檔案
#include "dsp2833x_examples.h" // dsp2833x 例子相關標頭檔案
void tim0_init(float freq, float period);
interrupt void tim0_irqn(void);
void tim1_init(float freq, float period);
interrupt void tim1_irqn(void);
void tim2_init(float freq, float period);
interrupt void tim2_irqn(void);
#endif /* time_h_ */
在主函式裡面判斷接收標誌,如果接收完成,則完成對應的處理函式。
本例中的操作是,完成後傳送當前收到的資料量,然後將資料打包發回。
本次例程**
提取碼:t0sc
時間間隔判斷思路
問題 很多時候需要和時間和時間間隔 進行判斷,比如說兩個時間範圍內的 天 周 月 季 年數,當然,通常來說比較有疑問的是 周和季度的判斷 現象 由於給出的時間不一定是整數周 季度 開始的臨界點,所以就出現了週數,季度數 結果的偏差 假設給出的時間段為 timestart,timeend,以週為例子 ...
間隔數判斷
題目描述 乙個整型陣列,給定乙個間隔t和乙個差值s,判斷數列中是否存在間隔為t的兩個數字,其差為s。輸入有兩行。第一行輸入 個n,隨後輸入n個整數。第二行輸入兩個整數,分別為t和s.輸入有兩行。一眼看上去這道題其實就是求兩個位置元素的差。記得加絕對值 但是,在陣列迴圈的時候要注意,i不能是從1到n,...
根據輸入時間間隔判斷EditText是否輸入完成
在android開發中經常會需要判斷輸入框的輸入完成情況 根據個人經驗總結出3條判斷editext輸入完成 1新增text監聽 在 aftertextchanged事件中延時2000ms根據延時前和延時後的時間對比判斷在2000ms內是否有再次輸入情況 addtextchangedlistenerb...