标题:
STC15W204S单片机串口程序哪里有问题?无论发送什么,都只是返回 没有接收数据
[打印本页]
作者:
chaoself
时间:
2023-11-25 00:53
标题:
STC15W204S单片机串口程序哪里有问题?无论发送什么,都只是返回 没有接收数据
如上代码,发送A03_Ligt01Off_#没反应,无论发送什么,都只是返回“没有接收数据!”。请问代码是哪里出错了?
#include "stc15.h"
#include"periphs.h"
#include"typedefs.h"
uchar BYTE;
uint WORD;
char RecvString_buf[16]; //定义数据包长度为15个字符
#define datapackage_headflag 'A' //用于串口通信时,定义数据包头部的验证标记
#define FOSC 11059200L //系统频率
#define BAUD 9600 //串口波特率
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位可变波特率 串口工作模式1
T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
}
/*----------------------------
发送串口数据
----------------------------*/
void SendData(uchar dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{
while (*s) //检测字符串结束标志
{
SendData(*s++); //发送当前字符
}
}
//串口接收函数
__bit ReceiveString()
{
char * RecStr=RecvString_buf;
char num=0;
unsigned char count=0;
loop:
*RecStr=SBUF;
count=0;
RI=0;
if(num<14) //数据包长度为15个字符,尝试连续接收15个字符
{
num++;
RecStr++;
while(!RI)
{
count++;
if(count>130)return 0; //接收数据等待延迟,等待时间太久会导致CPU运算闲置,太短会出现"数据包被分割",默认count=130
}
goto loop;
}
return 1;
}
__bit Deal_UART_RecData() //处理串口接收数据包函数(成功处理数据包则返回1,否则返回0)
{
if(RecvString_buf[0]==datapackage_headflag&&RecvString_buf[14]=='#')
{
if(RecvString_buf[1]=='0')
{
LED=1;
SendString("发送成功!\r\n");
}
else
{
LED=0;
SendString("发送失败!\r\n");
}
}
return 0;
}
/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() __interrupt(4)
{
if(ReceiveString())
{
//数据包长度正确则执行以下代码
Deal_UART_RecData();
}
else
{
//数据包长度错误则执行以下代码
//LED=!LED;
SendString("没有接收数据!\r\n");
}
RI=0; //接收并处理一次数据后把接收中断标志清除一下,拒绝响应在中断接收忙的时候发来的请求
}
/***************************
主函数
***************************/
void main()
{
EA=1;
UartInit();
while(1);
}
复制代码
作者:
aking991
时间:
2023-11-25 09:19
你的中断处理程序不对,比如那个num这个变量,你无论怎么运行它都是0,建议你修改中断处理程序,中断里只负责接收存入缓存,当接收完一帧数据后再利用起时机制在主程序中判断接收的数据是否你想要的
作者:
coody_sz
时间:
2023-11-25 21:31
可以参考测试STC官方的例程,串口1使用定时器2的程序,STC-ISP里的范例程序就有,可以直接下载HEX文件测试。
作者:
hy47566398
时间:
2023-11-27 17:30
while(!RI) 里加个Delay()试试
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1