一 通信的引入
1单工
2 半双工
3全双工
二 数据同步方式 异步方式
1 同步 特点
2 异步的特点
三 数据通信速率
1 比特率
2 波特率
四 硬件 和 软件 部分
五 代码实现
一 通讯的引入
1 单工 :只能单向发送或者接收
2半双工:都可以接收和发送 但是某个时段是单向的
3 全双工 :随时都可以接收和发送
二数据同步的同步异步方式
1 同步方式
数据传送石以数据块 发送给串口一次传输中字符间无间隔
传输过程中包含的数据块较多 所以接收和发送严格同步 通常要有同步时钟
通讯双方的时钟是连一起的。
异步方式
没有时钟的约束 使得通信双方的发送和接收不同步 不知道什么对方发送和什么接收到了
这样的同步方式 虽然 的传输速度很快 内部结构很复杂 反而异步方式 虽然速度慢 但是结构就相对简单了
三 数据通信速率
1 比特率 :每秒传输的二进制位
2 特率 :每秒传输的码元个数
其实 比特率 和波特率 相差不大
也就是说 一个二进制位 可以表示 一个码元
0----- 0
3.3-1
四 硬件 和软件 部分
五 代码实现
void usart_init()
{
GPIO_InitTypeDef GPIO_InitStruct;
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
// 1gpio时钟 串口时钟 引脚复用 时钟
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
//2 TX A9 输出 复用推挽输出
//2 RX A10 输入 浮空输入
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStruct);
USART_InitStruct.USART_BaudRate=115200;//波特率
USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流
USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStruct.USART_StopBits=USART_StopBits_1;//停止位
USART_InitStruct.USART_Parity=USART_Parity_No;//校验位
USART_InitStruct.USART_WordLength=USART_WordLength_8b;//字宽
USART_Init(USART1, &USART_InitStruct);//
USART_Cmd(USART1, ENABLE );//开启串口1
}
配置我们的 流水灯的 一样 找到对应的串口函数 配置 其结构体 这样不一样的是 我们在使用串口
需要使能异步串口时钟 和引脚的时钟 最后一个是要开启串口 基本是这样框架
我们让单片机 发送一个字符
看看我主函数是怎么写的
int main()
{
while(1)
{
USART_SendData(USART1, 'K');
while( USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);//清除发送标志位
USART_SendData(USART1, '\n');//换行结束
}
}