51单片机串口与ESP8266的通信问题

ycthwj_h2002 2019-08-14 03:22:54
void Uart2_init(void)
{
P_SW2 &= S2_S0; // 串口用p1.1,p1.0
S2CON = 0x10; //0001_0000: 方式0,允许接受
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值//T2用作波特率发生器。
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR |= 0x14; //T2为1T模式, 并启动定时器2
IE2 = 0x01; //使能串口2中断
EA = 1;
}

STC15单片机串口2与ESP8266通信。以上函数为串口2设置。

UART 中断服务程序
-----------------------------*/
void Uart2() interrupt 8 using 1
{

IE2 = 0x00; //关闭串口中断
if (S2CON & S2RI) //接受完一帧数据//S2RI = 1 ; 接受完成标志
{
S2CON &= ~S2RI; //清除S2RI位
Rec_Uart2_Buf[index++] = S2BUF; //接受缓冲器数据存入字符数组
test = 'T';
busy = 0;
}

if (S2CON & S2TI) //发送完一帧数据//S2TI = 1 : 发送完成标志。
{
S2CON &= ~S2TI; //清除S2TI位
test1 = 'M';
}
IE2 = 0x01; //打开串口中断
}

以上为串口2发送与接收中断处理函数,中断号为8。

单片机向ESP8266发送AT指令. AT指令是一个字符串,通过串口2发送一个一个字符来实现。
如下为发送字符函数:

void uart2_SendData(uchar dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat;
busy = 1;
S2BUF = ACC;

Uart1_Send_Data(test1);
Uart1_Send_Data(test);

}

其中,Uart1_Send_Data函数用来显示测试字符变量的值,在串口调试助手中显示。
实验表明,每次调用uart2_SendData函数,都能正确的引起发送和接受中断。test1和test能被正确的赋值。
串口助手中能显示M和T的值。

问题是: 如果接受中断中, 语句为: test =S2BUF. 那么 test的值,不是一个正确的字符。
查阅有关串口通信的资料,也有一些人出现相似的问题,请问大侠,该问题如何解决????

...全文
730 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ycthwj_h2002 2019-08-17
  • 打赏
  • 举报
回复
时序是正确的。应该是ESP8266的回传信号格式问题。

狗蛋王-yo 2019-08-14
  • 打赏
  • 举报
回复
试试严格控制时序,发的时候,不要收
狗蛋王-yo 2019-08-14
  • 打赏
  • 举报
回复
哦哦,不好意思,看漏了
狗蛋王-yo 2019-08-14
  • 打赏
  • 举报
回复

中断中开中断是啥意思

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧