![]() |
發布時間: 2021-1-11 21:54
正文摘要:真的好奇怪,定時發送一組8個數據,但串口助手結果是前兩個數據均為第一個數據,后面數據都正常發送,這是怎么回事?要發送的是一組8個數據是: uchar send[8]={0x01,0x03,0x00,0x00,0x00,0x01,0x84,0x0A};//發送一 ... |
地板說的有道理,看看你用的晶振是不是11.0592M的倍數。 |
串口通訊注意工作頻率,非波特率整倍工作頻率會得到一定百分比固定誤碼率。![]() ![]() |
//以下代碼在WQX-15開發板上,使用STC15W4K核心板調試串口1,晶振30M,波特率9600。 bit Uart1_Flag=1; u8 code Uart1_Up_Symbol_Buffer[30]={"\r\n溫度: 遙控解碼: 超聲波:mm"}; u8 xdata Uart1_Up_Num_Buffer[10]; //*********************************《人人學會單片機》視頻教程,祁緒電子2020-05 //串口初始化,配置定時器&波特率。STC15W,30M晶振,9600. //*********************************《人人學會單片機》視頻教程,祁緒電子2020-05 void Uart1_Init() { SM0=0; SM1=1; REN=1; //SCON|=0x50; PCON&=0x3f; AUXR|=0x01; AUXR|=0X14; T2H=0xfc; T2L=0xf3; ES=1; } //*********************************《人人學會單片機》視頻教程,祁緒電子2020-05 //串口發送函數。主函數調用,或者串口發送完中斷后馬上調用 //*********************************《人人學會單片機》視頻教程,祁緒電子2020-05 void Uart1_Up_Data_Drive() { static u8 xdata count=0; if(Uart1_Flag) //標志允許,發送一個字節 { Uart1_Flag=0; //標志位翻轉,只允許發送一個字節 count++; //字節編號增加。 switch(count) { case 1 : SBUF=Uart1_Up_Symbol_Buffer[0];break; //發送漢字的ASCII case 2 : SBUF=Uart1_Up_Symbol_Buffer[1];break; case 3 : SBUF=Uart1_Up_Symbol_Buffer[2];break; case 4 : SBUF=Uart1_Up_Symbol_Buffer[3];break; case 5 : SBUF=Uart1_Up_Symbol_Buffer[4];break; case 6 : SBUF=Uart1_Up_Symbol_Buffer[5];break; case 7 : SBUF=Uart1_Up_Symbol_Buffer[6];break; case 8 : SBUF=Uart1_Up_Num_Buffer[0];break; //發送數值 溫度 case 9 : SBUF=Uart1_Up_Num_Buffer[1];break; case 10 :SBUF=Uart1_Up_Num_Buffer[2];break; case 11 :SBUF=Uart1_Up_Num_Buffer[3];break; case 12 : SBUF=Uart1_Up_Symbol_Buffer[7];break; //發送漢字的ASCII case 13 : SBUF=Uart1_Up_Symbol_Buffer[8];break; case 14 : SBUF=Uart1_Up_Symbol_Buffer[9];break; case 15 : SBUF=Uart1_Up_Symbol_Buffer[10];break; case 16 : SBUF=Uart1_Up_Symbol_Buffer[11];break; case 17 : SBUF=Uart1_Up_Symbol_Buffer[12];break; case 18 : SBUF=Uart1_Up_Symbol_Buffer[13];break; case 19 : SBUF=Uart1_Up_Symbol_Buffer[14];break; case 20 : SBUF=Uart1_Up_Symbol_Buffer[15];break; case 21 : SBUF=Uart1_Up_Symbol_Buffer[16];break; case 22 : SBUF=Uart1_Up_Symbol_Buffer[17];break; case 23 : SBUF=Uart1_Up_Num_Buffer[5];break; //發送數值 遙控 case 24 : SBUF=Uart1_Up_Num_Buffer[6];break; case 25 : SBUF=Uart1_Up_Symbol_Buffer[18];break;//發送漢字的ASCII case 26 : SBUF=Uart1_Up_Symbol_Buffer[19];break; case 27 : SBUF=Uart1_Up_Symbol_Buffer[20];break; case 28 : SBUF=Uart1_Up_Symbol_Buffer[21];break; case 29 : SBUF=Uart1_Up_Symbol_Buffer[22];break; case 30 : SBUF=Uart1_Up_Symbol_Buffer[23];break; case 31 : SBUF=Uart1_Up_Symbol_Buffer[24];break; case 32 : SBUF=Uart1_Up_Symbol_Buffer[25];break; case 33 : SBUF=Uart1_Up_Symbol_Buffer[26];break; case 34 : SBUF=Uart1_Up_Num_Buffer[7];break; //發送數值 超聲波 case 35 : SBUF=Uart1_Up_Num_Buffer[8];break; case 36 : SBUF=Uart1_Up_Num_Buffer[9];break; case 37 : SBUF=Uart1_Up_Symbol_Buffer[27];break;//發送漢字的ASCII case 38 : SBUF=Uart1_Up_Symbol_Buffer[28];break; case 39 :count=0;break;//最后一步 沒有發送字節,串口TI不會置1,所以不再發送 } } } //*********************************《人人學會單片機》視頻教程,祁緒電子2020-05 //串口中斷,接收一個字節,馬上發送N個字節,發送數組顯示到電腦 //*********************************《人人學會單片機》視頻教程,祁緒電子2020-05 void Uart1_Routine() interrupt 4 { static char Uart1_ser_n=0; //用于接收計數 if(RI) //如果接收到一個字節 { RI=0; //標志位清除 Uart1_Flag=1; //串口發送允許 if(SBUF==0x7f)//9600波特率 //判斷連續多個0x7f { Uart1_ser_n++; //判斷連續多個0x7f if(Uart1_ser_n>=10) //判斷連續多個0x7f { Uart1_ser_n=0; //清0 IAP_CONTR|=0xe0; //執行自動軟復位,可以做調試用 } } } if(TI) //如果上一個字節發送完成了 { TI=0; //標志位清除 Uart1_Flag=1; //串口發送允許 Uart1_Up_Data_Drive(); //執行串口發送下一個字節 } } |