7 28335以時間間隔判斷幀

2021-10-21 09:10:58 字數 3766 閱讀 7020

在序列通訊中,很難判斷幀標誌,常用的方法是定長、結束符等方法。定長就是約定好協議字元位元組長度,當收到所有位元組後開始處理,但是這種方法不適用於不定長的通訊。結束符就是約定一定的字元作為判斷通訊結束的標誌,比如常用的回車換行符,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...