首先模式改成可变波特率的9位方式:
我们直接用STC的ISP工具:
自动生成代码
void Uart2_Init(void) //9600bps@24.000MHz
{
P_SW2 |= 0x01; //UART2/USART2: RxD2(P4.6), TxD2
S2CON = 0xD0; //9位数据,可变波特率
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x8F; //设置定时初始值
T2H = 0xFD; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x01; //使能串口2中断
Rec_Num = 0;
B_TX2_Busy = 0;
}
接着改接收数据部分:
void Uart2_SendStr( u8 *puts ) //串口数据发送函数
{
u8 dat;
for (; *puts != 0;puts++) //遇到停止符0结束
{
dat = *puts;
ACC = dat;
if( P )
S2TB8 = 0;
else
S2TB8 = 1;
S2BUF = dat;
B_TX2_Busy = 1;
while(B_TX2_Busy);
}
}
这里的if(P) 实际就是if(S2RB8) ,S2RB8 这是接收到的第9位数据
原来是if(S2RBB==(!P)) 就是奇校验(第9位和前面8位加起来刚好取反)
就是奇校验成立,那就保存接收到是数据:
if (S2CON & 0x01) //检测串口2接收中断
{
S2CON &= ~0x01; //清除串口2接收中断请求位
dat = S2BUF;
ACC = dat;
//S2BUF
if( S2RB8 == (!P)) //奇校验,P是奇偶校验位
Rec_Dat = dat;
}
发送的时候也要处理一下:
void Uart2_SendStr( u8 *puts ) //串口数据发送函数
{
u8 dat;
for (; *puts != 0;puts++) //遇到停止符0结束
{
dat = *puts;
ACC = dat;
if( P )
S2TB8 = 0;
else
S2TB8 = 1;
S2BUF = dat;
B_TX2_Busy = 1;
while(B_TX2_Busy);
}
}
要看懂这几句是处理第9位数据:
if( P )
S2TB8 = 0;//第9位数据为0
else
S2TB8 = 1; //第9位数据为1
编译下载后,先试一下无校验
没有任何反应
改成奇校验:我们再发送一下数据
串口助手发送OPEN:
串口通信的超时中断
当我们在做串白接收的程序的时候,往往需要当接收到一串数据的时候需要及时的响应。但是响应的第一步就是我们得先判断这一包数据是否已经接收完成,必须要接收完成了才能进行下一步动作;
超时中断是用的非常多的
一包数据是否结束,要么有回车,要么时间超时
很多方法比较,最好还是超时:
看看超时中断相关寄存器: