串行通信
① UART(通用异步全双工收发器):
(1)串行:多个时钟周期内,每一时钟周期采样一位有效数据,通信速度慢,抗干扰能力强;
(2)并行:多个时钟周期内,每一时钟周期采样一组有效数据,通信速度快,抗干扰能力弱,资源占用多;
② 如何定义
(1)同步:有时钟线,误差小,占用资源多;
(2)异步:无时钟线,传输速率高;
(3)单工:单一方向传输数据;
(4)双工:
1、全双工:收发同时;
2、半双工:一根线实现收发;
③ UART模型:
协议:RS232:
(1)电气特性:DB9的235接口;
(2)帧格式;
④ 数据帧格式
(1)起始位:1位低电平;
(2)有效数据位:8或9位;
(3)校验位(奇或偶):1位校验位;
(4)结束位:0.5 / 1 / 1.5 / 2 位高电平;
⑤ 传输速率
(1)bit / s 比特率;
(2)B / s 波特率;
⑥ 任务:使用串行通信控制灯开关
代码:
#include "Key_Use.h"
#define MAX 20
#define Timeout 0xFFFF
static u32 j=MAX, i=0, k=0, l=0, a=0;
uint8_t UART1_Ctrl[6][6]={"led_r","led_g","led_b","bee_o","led__","bee__"};
uint8_t Mesage[6]={"\0"};
HAL_StatusTypeDef UART1_SendStr(uint8_t *buf,uint32_t size)
{
return HAL_UART_Transmit(&huart1, buf, size, Timeout);
}
HAL_StatusTypeDef UART1_ResvStr(uint8_t *buf,uint32_t size)
{
return HAL_UART_Receive(&huart1, buf, size, Timeout);
}
void UART1_LEDCtrl()
{
while(1)
{
if(UART1_ResvStr((uint8_t *)Mesage,5) == HAL_OK)
{
if(memcmp(Mesage,UART1_Ctrl[0],5) == 0)
{
LED_G_OFF();
LED_B_OFF();
LED_R_ON();
}
///////////////////////////////////////
if(memcmp(Mesage,UART1_Ctrl[1],5) == 0)
{
LED_R_OFF();
LED_B_OFF();
LED_G_ON();
}
///////////////////////////////////////
if(memcmp(Mesage,UART1_Ctrl[2],5) == 0)
{
LED_G_OFF();
LED_R_OFF();
LED_B_ON();
}
///////////////////////////////////////
if(memcmp(Mesage,UART1_Ctrl[3],5) == 0)
BEEP_ON();
///////////////////////////////////////
if(memcmp(Mesage,UART1_Ctrl[4],5) == 0)
{
LED_G_OFF();
LED_R_OFF();
LED_B_OFF();
}
///////////////////////////////////////
if(memcmp(Mesage,UART1_Ctrl[5],5) == 0)
BEEP_OFF();
}
memset(Mesage,0,6);
}
}