久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 請教STC15單片機串口4的發送數據的程序問題 [打印本頁]

作者: ZHAOBAO511    時間: 2022-6-27 15:04
標題: 請教STC15單片機串口4的發送數據的程序問題
如題,只發一次就不發了。單片機代碼如下:

void serial_port4_initial(){

        S4CON = 0x10;                //8位數據,可變波特率
        S4CON |= 0x40;                //串口4選擇定時器4為波特率發生器
        T4T3M &= 0xDF;                //定時器時鐘12T模式
        T4L = 0xDD;                //設置定時初始值
        T4H = 0xFF;                //設置定時初始值
        T4T3M |= 0x80;                //定時器4開始計時

        IE2 |= 0x10;         //ES4 = 1;
        P_SW2=0x04;         //串口2、3、4的位置
        EA = 1;

}


void send_UART4(uchar dat)
{
         uchar temp = 0;
        

        S4CON = S4CON & 0xfd;  //S4TI = 0;

                S4BUF = dat;
                do
                {
                        temp = S4CON;
                        temp = temp & 0x02;                //temp=S2TI
                }while(temp == 0);
                S4CON = S4CON & 0xfd;            //S4TI = 0;
        

}

主函數:
serial_port4_initial();
        while(1)
        {        


                delayms(500);
        
                send_UART4(0X28);
               
        }        
意思是500毫秒發一次,結果發一次就不發了。  

作者: mornbin    時間: 2022-6-27 16:34
看下delayms函數,可能是這個函數的問題
作者: ZHAOBAO511    時間: 2022-6-27 17:37
mornbin 發表于 2022-6-27 16:34
看下delayms函數,可能是這個函數的問題

謝謝,是這里問題:
void Usart4() interrupt 18
{
        UART4_INT_DISABLE();       
        if(RI4)
        {
                CLR_RI4();                               //清除RI位
               
        }
        void Usart4() interrupt 18
{
        UART4_INT_DISABLE();       
        if(RI4)
        {
                CLR_RI4();                               //清除RI位
               
        }
        UART4_INT_ENABLE();       
}       
}要把這個加上,但現在是報警告,UART4_INT_ENABLE();UART4_INT_DISABLE();        這兩個警告不管能發,然后定義這兩個就不能發。 //#define                UART4_INT_DISABLE()                IE2 &= ~(1<<4)        //允許串口3中斷
作者: lkc8210    時間: 2022-6-27 17:49
定義運算,要加";"號于結尾
#define  UART4_INT_DISABLE() IE2 &= ~(1<<4);        //允許串口3中斷
作者: ZHAOBAO511    時間: 2022-6-27 18:52
lkc8210 發表于 2022-6-27 17:49
定義運算,要加";"號于結尾
#define  UART4_INT_DISABLE() IE2 &= ~(1

謝謝,加不加這個好像不影響。
作者: Y_G_G    時間: 2022-6-27 20:29
既然串口用了中斷,就不用再在發送函數中等待發送完成
因為,一旦發送完成,優先是進入中斷的,我不知道中斷觸發后,不清除中斷標志位(S4TI),程序會不會是一直卡在中斷中
個人感覺就是因為S4TI沒有清除,而你又開了中斷,所以,程序是發送一次之后,中斷觸發了,就一直卡在中斷中出不來了
推薦增加一個中斷標志位,然后在中斷觸發后清除
while(busy);busy=1;S4BUF = dat;


busy在串口中斷觸發后,在中斷中清除,并清除S4TI
這樣可以提高中斷的效率

作者: ZHAOBAO511    時間: 2022-6-28 10:09
本帖最后由 ZHAOBAO511 于 2022-6-28 10:16 編輯
Y_G_G 發表于 2022-6-27 20:29
既然串口用了中斷,就不用再在發送函數中等待發送完成
因為,一旦發送完成,優先是進入中斷的,我不知道中斷觸 ...

謝謝,您這個方法可以,已正常運行,謝謝。
作者: redstars    時間: 2023-5-28 00:06
mornbin 發表于 2022-6-27 16:34
看下delayms函數,可能是這個函數的問題

能幫我看看嗎?我用的是串口3進行數據收發。但串口3只能發,外面的數據讀進不了單片機中。
void UART3_Init()
{       
    P_SW2 &= ~S3_S0;                  //切換到 P0.0\P0.1
        S3CON = 0x10;                //8位數據,可變波特率;允許接收
        //S3CON &= 0xBF;                //串口3選擇定時器2為波特率發生器
        T2L = 0xE0;                   //設置定時初始值
        T2H = 0xFE;                   //設置定時初始值
    AUXR = 0x14;       //T2為1T模式, 并啟動定時器2
    IE2 = 0x08;         //使能串口3中斷
    EA = 1;
}

void uart3_inte() interrupt 17
{
   unsigned char num=0;
    //接收
   if(S3CON & 0x02)                   //發送中斷標志S3TI=1
   {
      S3CON &=0xFD;;           //發送中斷標志清零S3TI=0
     
          if (S3CON & 0x01)
      {
        S3CON &=0xFE;        //清除S3TI位
                //R_table[count]=S3BUF;    //busy=0;
                num = S3BUF;
                num++;
                S3BUF = num;                                //返回數值
      }           
   }
}
作者: redstars    時間: 2023-5-28 00:09
lkc8210 發表于 2022-6-27 17:49
定義運算,要加";"號于結尾
#define  UART4_INT_DISABLE() IE2 &= ~(1

大佬,我這個用串口3收發數據,但現在只能收,發的單片機讀不進去。現在不知道啥原因?求教
void UART3_Init()
{       
    P_SW2 &= ~S3_S0;                  //切換到 P0.0\P0.1
        S3CON = 0x10;                //8位數據,可變波特率;允許接收
        //S3CON &= 0xBF;                //串口3選擇定時器2為波特率發生器
        T2L = 0xE0;                   //設置定時初始值
        T2H = 0xFE;                   //設置定時初始值
    AUXR = 0x14;       //T2為1T模式, 并啟動定時器2
    IE2 = 0x08;         //使能串口3中斷
    EA = 1;
}

void uart3_inte() interrupt 17
{
   unsigned char num=0;
    //接收
   if(S3CON & 0x02)                   //發送中斷標志S3TI=1
   {
      S3CON &=0xFD;;           //發送中斷標志清零S3TI=0
     
          if (S3CON & 0x01)
      {
        S3CON &=0xFE;        //清除S3TI位
                //R_table[count]=S3BUF;    //busy=0;
                num = S3BUF;
                num++;
                S3BUF = num;                                //返回數值
      }           
   }
}




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 91精品久久久久久久久 | 欧美一级黄带 | 亚洲一区二区视频 | 精品国产18久久久久久二百 | 欧美va大片 | 欧美综合在线观看 | 国产成人午夜精品影院游乐网 | 日日久| 久久这里只有精品首页 | 99免费在线视频 | 日韩精品专区在线影院重磅 | 国产精品国产三级国产aⅴ中文 | 日本成人中文字幕 | 欧美在线观看一区 | 狠狠干2020 | 最新国产在线 | 久久最新精品 | 亚洲一区 中文字幕 | 国产1区2区3区 | 亚洲久久在线 | 欧美日日 | 日韩精品在线观看网站 | 国产一区二区三区四区在线观看 | 91精品国产综合久久精品 | 羞羞色网站| 草久久免费视频 | 成人免费视频在线观看 | 超碰91在线| 日韩在线精品视频 | 欧美日韩淫片 | 亚洲欧美综合 | 热re99久久精品国产99热 | 一区二区免费视频 | 久久33| 精品日韩在线 | 欧洲精品一区 | 成年视频在线观看福利资源 | 精品视频一区在线 | 欧美视频偷拍 | 成人欧美一区二区三区黑人孕妇 | 欧美一区二区三区的 |