標題:
STC15W204S單片機串口程序哪里有問題?無論發(fā)送什么,都只是返回 沒有接收數(shù)據(jù)
[打印本頁]
作者:
chaoself
時間:
2023-11-25 00:53
標題:
STC15W204S單片機串口程序哪里有問題?無論發(fā)送什么,都只是返回 沒有接收數(shù)據(jù)
如上代碼,發(fā)送A03_Ligt01Off_#沒反應,無論發(fā)送什么,都只是返回“沒有接收數(shù)據(jù)!”。請問代碼是哪里出錯了?
#include "stc15.h"
#include"periphs.h"
#include"typedefs.h"
uchar BYTE;
uint WORD;
char RecvString_buf[16]; //定義數(shù)據(jù)包長度為15個字符
#define datapackage_headflag 'A' //用于串口通信時,定義數(shù)據(jù)包頭部的驗證標記
#define FOSC 11059200L //系統(tǒng)頻率
#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的波特率發(fā)生器
ES = 1; //使能串口1中斷
EA = 1;
}
/*----------------------------
發(fā)送串口數(shù)據(jù)
----------------------------*/
void SendData(uchar dat)
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
/*----------------------------
發(fā)送字符串
----------------------------*/
void SendString(char *s)
{
while (*s) //檢測字符串結(jié)束標志
{
SendData(*s++); //發(fā)送當前字符
}
}
//串口接收函數(shù)
__bit ReceiveString()
{
char * RecStr=RecvString_buf;
char num=0;
unsigned char count=0;
loop:
*RecStr=SBUF;
count=0;
RI=0;
if(num<14) //數(shù)據(jù)包長度為15個字符,嘗試連續(xù)接收15個字符
{
num++;
RecStr++;
while(!RI)
{
count++;
if(count>130)return 0; //接收數(shù)據(jù)等待延遲,等待時間太久會導致CPU運算閑置,太短會出現(xiàn)"數(shù)據(jù)包被分割",默認count=130
}
goto loop;
}
return 1;
}
__bit Deal_UART_RecData() //處理串口接收數(shù)據(jù)包函數(shù)(成功處理數(shù)據(jù)包則返回1,否則返回0)
{
if(RecvString_buf[0]==datapackage_headflag&&RecvString_buf[14]=='#')
{
if(RecvString_buf[1]=='0')
{
LED=1;
SendString("發(fā)送成功!\r\n");
}
else
{
LED=0;
SendString("發(fā)送失敗!\r\n");
}
}
return 0;
}
/*----------------------------
UART 中斷服務程序
-----------------------------*/
void Uart() __interrupt(4)
{
if(ReceiveString())
{
//數(shù)據(jù)包長度正確則執(zhí)行以下代碼
Deal_UART_RecData();
}
else
{
//數(shù)據(jù)包長度錯誤則執(zhí)行以下代碼
//LED=!LED;
SendString("沒有接收數(shù)據(jù)!\r\n");
}
RI=0; //接收并處理一次數(shù)據(jù)后把接收中斷標志清除一下,拒絕響應在中斷接收忙的時候發(fā)來的請求
}
/***************************
主函數(shù)
***************************/
void main()
{
EA=1;
UartInit();
while(1);
}
復制代碼
作者:
aking991
時間:
2023-11-25 09:19
你的中斷處理程序不對,比如那個num這個變量,你無論怎么運行它都是0,建議你修改中斷處理程序,中斷里只負責接收存入緩存,當接收完一幀數(shù)據(jù)后再利用起時機制在主程序中判斷接收的數(shù)據(jù)是否你想要的
作者:
coody_sz
時間:
2023-11-25 21:31
可以參考測試STC官方的例程,串口1使用定時器2的程序,STC-ISP里的范例程序就有,可以直接下載HEX文件測試。
作者:
hy47566398
時間:
2023-11-27 17:30
while(!RI) 里加個Delay()試試
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1