uart:universal asynchronous receiver/transmitter,通用非同步接收/傳送裝置
不知道資料什麼時候來
soc和pc等裝置都是ttl電平
0v 為 0
3.3v/5v為1
電平轉換模組的作用:
因為串列埠用於遠距離通訊,會影響到電路的電壓,如果還是如上面這樣採用ttl電平, 就會出現問題;
以下是常用的兩種匯流排:
r232匯流排
距離25公尺以內,全雙工;每根線,大小在正負3-15v之間
r485匯流排
距離1200公尺,半雙工;通過兩根線的電壓差表示大小
訊號協議(資料位、停止位、奇偶校驗)
一定時序(波特率)
首先進行電平的裝換,通知接收裝置準備接收資料
串列埠接收,採用中斷,盡量不在中斷裡處理資料,最好用乙個大的佇列來儲存接收的資料,如果硬體支援就用硬體的,否則就自己搭乙個軟體fifo;
串列埠傳送,根據需求選擇是否採用中斷,如果採用中斷,就像上面一樣採用佇列儲存資料,依次傳送;
如果直接傳送,需要確保在傳送過程中,不被打斷/搶占,導致傳送丟包,或者出錯(如,前面傳送010203040506,傳送了010203,然後中斷傳送070809101112;實際傳送就是010203-070809101112-040506)
uart.h
//快取最大值,最多一次性可接收的位元組數
#define uart_queue_max_size 80
//資料幀起始或結束資料
#define uart_queue_start_data 0xaa
#define uart_queue_end_data 0x55
#define uart_queue_start_lenght 0x10
//資料幀長度
#define uart_queue_data_frame_length 6
typedef struct uart_cmd_queue_
uart_cmd_queue_struct;
uart.c
/* 佇列fifo */
uart_cmd_queue_struct m_que;
/** * @brief 串列埠接收佇列復位
* @param none
* @retval none
*/void uart_queue_reset(void)
/** * @brief 存入乙個資料到串列埠接收佇列(fifo)中
* @param 存入的資料
* @retval none
*/void uart_queue_push(unsigned char l_dat)
}/**
* @brief 從串列埠接收佇列(fifo)中取出乙個位元組資料
* @param 取出的資料
* @retval none
*/void uart_queue_pop(unsigned char *l_dat)
}/**
* @brief 獲取串列埠接收佇列(fifo)的長度
* @param none
* @retval 接收佇列(fifo)的長度
*/unsigned int uart_queue_size(void)
/** * @brief 找出完整一幀指令
* @param 完整一幀指令
* @param 快取區大小
* @retval 完整指令長度
*/unsigned int uart_queue_find_cmd(unsigned char *buf)
buf[m_cmd_pos] = l_dat;
m_cmd_pos = 1;
break;
}default:
else
}m_cmd_pos++;
break;}}
return 0; //沒有形成完整的一幀
}
UART串列埠通訊
先簡單說說串列埠通訊 uart 我做的這個實驗只針對rs232標準,在fpga與上位機給出的rs232口之間通過電平轉換電路 最上面圖中的max232晶元 實現ttl電平與rs232電平之間的轉換。我們只關心rs232 tx和rs232 rx兩個訊號,rs232 tx是資料傳送埠,rs232 rx是...
UART串列埠非同步通訊
1.波特率 通訊裝置之間需要約定好波特率 每秒鐘傳送的二進位制位的個數,單位baud 常見的波特率有4800,9600,115200。2.通訊的起始訊號和停止訊號 usart協議空閒位預設為高電平,起始訊號拉低,停止位 0.5 1 1.5 2位的高電平 3.有效資料 起始位後緊著著就是傳輸的有效資料...
十 UART 串列埠通訊
uart 通用非同步收發器,通常用於微控制器和電腦之間以及微控制器和微控制器之間的通訊。在 uart 通訊過程中,是低位先發,高位後發的原則。波特率 傳送二進位制資料位的速率,習慣上用 baud 表示,即我們傳送一位二進位制資料的持續時間 1 baud。台式電腦 rs232介面 微控制器和pc進行通...