1、首先是串口发送的实验部分,先进行初始化
用到了USART和GPIO口的时钟并初始化,然后开启使能,其中GPIO口选择复用推挽模式,USART的参数分别为9600的波特率,选择为发送模式
然后是传输各类数据的函数
首先是发送一个字节的函数,这个属于最基础的函数,后续都会以这个为基础
之后是发送一个数组,通过for循环,逐次调用发送字节函数
之后是发送字符串的函数
之后是发送数字的函数,对于数字的发送,选用拆分数字的形式,即通过(数字/10^x次)%10分别得出数字的每一位,以下是10^x次函数
然后定义发送数字的函数,在显示部分加了一个偏移量,因为根据16进制的ASCLL码来说,数字是在ox30或者'0'之后才是数字,因此需要加一个偏移量。
主函数如下所示:分别发送一个16进制数字、数组、字符串、任意10进制数字(显示为10进制)
除了以上方式显示外,还有printf的移植函数;
一般采用第一种,第一种一次只能传输一个字节
定义一个函数在主程序中调用
第二种则是先定义一个字符串,然后打印,最后发送
第三种则是第二种的封装,其中用到了可变参数
以下为主程序中的函数,其中\r\n才表示换行
其中对于汉字的显示,如果Keil用UTF-8则需要在Misc Controls设置中增加一句,如下所示:
在串口助手中也需要配置为UTF-8的模式,如果用GB则两者都为GB,需要统一,这里使用UTF-8的模式
结果显示:
首先需要将串口号改为自己连接的模式在,此电脑-——设备管理器——端口有显示USB连接的串口号,之后打开串口,首先接收模式选择为HEX模式,这个是16进制的显示,因此不论传输什么都将显示为16进制的数字
之后改为文本模式,将以上程序正常显示,按复位键可以重新发送数据:
之后是串口的发送接收实验:
在以上代码的基础上增加了接收的部分程序:
首先是初始化部分:
增加GPIO口10的初始化
将USART的模式增加接收模式
接收主要分为两部分:查询和中断
首先是查询,去判断当RX的标志位置1,表明有数据需要接收,开始接收:
如果是中断,需要增加NVIC的配制以及中断函数:
主函数显示如下:
结果如下:
在发送区发送41,选择HEX模式,接收区有显示:
OLED屏也有显示:
以下是理论部分:
由于单片机的功能有限,因此需要外加别的东西实现功能,譬如蓝牙通信,出现通信协议
全双工:通信双方进行双向通信,双方可以同时发送和接收数据,打电话
半双工:只有一根线进行通信,双方可以交替发送和接收数据,对讲机
单工:只能规定方向的一根线传输,只有一方发送,一方接收不能互换,广播
异步通信没有单独的时钟线需要约定一个采样频率等,靠比特率;同步时钟线
单端信号的双方需要共地,差分信号不需要共地,USB有些模块也需要共地
点对点设备相当于老师叫你去办公室进行谈话
多设备相当于老师在教室和某个同学谈话(可挂载其他设备在总线),需要寻址的过程(找到对应学生)
串口通信可以实现芯片和电脑的通信
一般最简单的电路有以下4个即可
只有电平标准一致的电路才可实现通信
差分信号抗干扰性能强
串口参数:
波特率用于异步通信,如:1000bps,表示1秒发送1000个数据,一个数据是1ms
在空闲状态时,一直为高电平(上拉输入),当起始位来时,出现一个低电平,之后开始传输数据,停止位为高电平
数据位是低位先行,即传输16进制0F时转换为二进制为00001111,那么在发送时就为11110000,像入栈,低位先行之后接收方就能直接接收并显示数据。波形如下所示:
检验位分为:无校验、奇校验、偶校验
左边为无校验,右边为奇校验或者偶校验(只能在一定程度上检查数据是否出错)
对于右边来说:当传输数据为00001111,奇校验,则校验位需要置1,构成5个1,用于查询数据是否出错
CRC校验的性能更好。
接下来是一些串口波形:
发送OX55,波特率为9600,二进制为01010101,而数据为低位先行,就是10101010,起始位为0,停止位为1,无检验位,如下所示:
发送OX55,波特率为4800,波形周期为原来的两倍,偶检验,OX55二进制为01010101,发送时为10101010,偶检验位为0,波形如下:
停止位的长度也可配制:1位、1.5位、2位等
以下是连续发送两个OX55,一个是1位停止位,一个是2位停止位
总的来说是TX定时输出高低电平,RX定时读取高低电平。
USART的外设:
与UART相比多了一个同步通信,用于兼容其他协议,只接受时钟输出,并不能两个USART进行同步通信,它主要是异步通信
数据位长度包含校验位,有校验位数据位为9,没有就是8位
一般在配制时波特率为9600或者115200,无校验位,数据位为8,1位停止位
硬件流控制可以防止当A向B传输数据时因为B的处理速度过慢而导致新数据替代旧数据,有了一根线之后只有当B准备好时A才会传数据。
接下来是一个流程图
当数据传输到发送移位寄存器时,TXE就置1,不论寄存器里的数据是否被转移;当数据传输到RDR时,RXNE置1表示有数据进来需要接收。右移数字。
不同停止位:
之后是采样是当一直检测到高电平,突然出现一个0时,可能表示出现下降沿,将开始16次采样,防止是噪声导致的下降沿出现,前边不满足以下条件都视为噪声引起的错误下降沿,之后开始重新接收,如果在每3位中出现2个0可认为检测通过,但是噪声标志位NE置1,表明有数据接收,但是存在噪声。然后如果经过两次检测后发现接收的数据不是噪声造成,就将8、9、10位作为每一位的正中间进行采样,从而对其了接下来每一个数据位。
之后数据位进行接收,8、9、10次的采样数据为准(正中间,不存在数据正在翻转情况),如果全为1或0就为1或0,如果2个1,1个0,该数据位就为1,反之亦然,这种情况下噪声标志位依然是1。
之后是波特率发生器的定义(库函数可直接得,了解即可)
当输出波特率为9600时,时钟内部频率为72MHz,DIV就等于72MHz/9600/16=468.75转化为二进制就是111010100.11高位补零,剩余补零。