串口作为嵌入式开发中最常见,同时也是最方便使用的一种数据交换方式,不光是我们,芯片的设计厂商也是这么想的。于是在新款的MCU上,不光设计了多个串口,而且还将这些串口设计了可以重映射的功能。即使设计的IO口被占用,也可以换为其他的引脚引出。如果是传统的单片机,或是引脚数极少,不能随意更换引脚或根本没有原生串口的单片机该怎么办呢?
一般来说,我们使用的串口通常指的是UART(Universal Asynchronous Receiver/Transmitter),其中比较重要的是“异步 Asynchronous”这一概念,它意味着,使用UART进行通讯时,没有一个时钟信 来同步收发两端的信息传输过程。那么为了解决这个问题,串行协议中引入了开始位和结束位(Start Bit / Stop Bit)的概念,并通过限定每个信息的长度相同,保证收到的内容和发送的内容一致。光有这两者还不能确定传输的正确性,因此我们还要保证收发端以同样的速度采样,这就是波特率的意义,它使得两端以同样的速度发送和接收。
那么,最简单的实现方法就呼之欲出了:我们可以在程序中每隔固定的时长改变任意引脚的电平状态,只要延时时间满足波特率的需求,那么我们就能够在任意引脚上实现串行数据输出。但这样做存在着两个问题:首先,这一延时时间必须足够精确,否则累加的误差和晶振的不准确会导致传输失败。而如果采用软延时的话,机时将被白白浪费,在数据传输完之前都不能够做其他工作。
比较好的办法是使用定时器中断。我们需要设定定时器中断以定期触发数据的发送。比如如果我们采用9600波特率的话,那么此时的时间间隔就应该为1/9600=104us。设定你的定时器中断成这个时间。采用这种方式你也依然避免不了晶振的误差所导致的误差,所以你需要多次尝试以找到这个晶体所存在的偏差并在定时器设定里修正。之后是最重要的中断处理函数(ISR)了。在这里完成发送的操作。首先,我们检查最低有效位(LSB)上的值,并将其置位给输出的引脚。之后我们将存有发送内容的全局变量右移一位,直到所有数据都被发送完。
这种方式被称作bit bang’ing,也可以从功能性的角度称它为“软串口”。对于8脚或更少的单片机,使用这种方式可以有效提高串口的灵活性。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!