使用单片机的GPIO口去模拟串口的TX与RX进行数据的发送和接收处理,里面主要需要关注的和使用的为:GPIO的初始化,时钟频率的设置,引脚中断的设置。

模拟串口的TX:

首先初始化对应的GPIO口。
然后以115200的波特率对数据进行发送。

首先按照串口数据的格式,将要发送的1字节数据以起始位加结束位的形式进行封装:
u8 byte = 0x01;
u8 bit[10] = {0};
bit[0] = 0;//起始位
bit[1] = (byte & 0x01)? tmp_bit1 : tmp_bit0;
bit[2] = ((byte>>1) & 0x01)? tmp_bit1 : tmp_bit0;
bit[3] = ((byte>>2) & 0x01)? tmp_bit1 : tmp_bit0;
bit[4] = ((byte>>3) & 0x01)? tmp_bit1 : tmp_bit0;
bit[5] = ((byte>>4) & 0x01)? tmp_bit1 : tmp_bit0;
bit[6] = ((byte>>5) & 0x01)? tmp_bit1 : tmp_bit0;
bit[7] = ((byte>>6) & 0x01)? tmp_bit1 : tmp_bit0;
bit[8] = ((byte>>7) & 0x01)? tmp_bit1 : tmp_bit0;
bit[9] = 1;//结束位

形成一个8:1:1的数据格式
然后就是将封装好的数据bit按照115200的时序写入到对应IO的寄存器上就可以完成一个字节数据的发送。其中15200的时序就是每8us的时间间隔发送1比特的数据。
对于时序的使用可以使用硬件定时器或者空指令(空指令指的是空运行一条语句,一般运行一条语句的时间为1/系统时钟频率,所以根据语句的时间可以间隔一个发送1位比特数据时间)。

模拟串口的RX:

首先初始化对应的GPIO口。
然后以115200的波特率对数据进行接收。
在接收数据时我们可以通过引脚的中断判断起始位数据。然后对数据位进行时序接收。

在接收数据时我们可以通过引脚的中断判断起始位数据。然后对数据位进行时序接收。
后面将接收到的bit位数据拼接为1个字节的数据。
for(unsigned char i = 0;i < 8;i++)
{
Byte |= Bit[i] << i;
}

其中时序的判断依然是可以使用时钟频率使用空指令去间隔。如果在不能使用中断的情况下可以直接去监听当前引脚上的电平,来完成对起始位的判断。