欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3504|回復(fù): 11
收起左側(cè)

51單片機進行一個主機對對多個從機廣播

[復(fù)制鏈接]
ID:646224 發(fā)表于 2019-11-21 01:00 來自觸屏版 | 顯示全部樓層 |閱讀模式
現(xiàn)在采用的是stc12c5a60s2的單片機作為主機,其余六塊作為從機! 主機以廣播的方式發(fā)送數(shù)組數(shù)據(jù),其中包括幀頭+地址+命令+幀尾共四個字節(jié),而且是不斷發(fā)送! 在串口助手上可以看到對應(yīng)的輸出。
  問題來了,我現(xiàn)在從機需要接受數(shù)據(jù)并且用接受到的地址與自身比對,成功就執(zhí)行接受到的數(shù)組數(shù)據(jù)的第三位命令位對應(yīng)的命令。 這個就是沒有成功。不知道壇友們有沒好的方法?

急用,求大佬指點
回復(fù)

使用道具 舉報

ID:25310 發(fā)表于 2019-11-21 08:07 | 顯示全部樓層
從機接收端要識別接收,比如一幀數(shù)據(jù)為:55 01 02 aa ,  55 和AA是頭尾,串口接收時叢55開始才放到數(shù)組第一個位置,依次接收到最后AA就是一幀數(shù)據(jù)。開始不是55 的直接退出不接收這樣就避免收到錯誤的數(shù)據(jù)。
回復(fù)

使用道具 舉報

ID:138097 發(fā)表于 2019-11-21 08:14 | 顯示全部樓層
看上去理論是沒有問題的,不過實際操作會不會哪步出現(xiàn)問題,排查一下啊,從機仿真看一下接收到?jīng)]有
回復(fù)

使用道具 舉報

ID:306810 發(fā)表于 2019-11-21 08:42 | 顯示全部樓層
主機發(fā)送成功了?在串口助手上能夠監(jiān)控到數(shù)據(jù)了?以上都成功了,那么從機有成功收到數(shù)據(jù)么?如果有,那么就是你的程序處理報文的問題了。
回復(fù)

使用道具 舉報

ID:470332 發(fā)表于 2019-11-21 08:59 | 顯示全部樓層
1、首先,你試試一對一通信能不能正確接收
2、如果只接收理論上是可以的
3、如果從機還需要發(fā)送,如果直接把TX RX并在了主機上,這樣應(yīng)該不行,你從機的TX不能接在一起
回復(fù)

使用道具 舉報

ID:617449 發(fā)表于 2019-11-21 09:58 | 顯示全部樓層
1、多機通訊采用 RS485 方式
2、先把一對一的調(diào)試好
3、在擴展到6個分機
4、給你看一個 20 點485通訊的
http://www.raoushi.com/bbs/dpj-170710-1.html
回復(fù)

使用道具 舉報

ID:646224 發(fā)表于 2019-11-21 13:20 | 顯示全部樓層
pcbboy 發(fā)表于 2019-11-21 08:07
從機接收端要識別接收,比如一幀數(shù)據(jù)為:55 01 02 aa ,  55 和AA是頭尾,串口接收時叢55開始才放到數(shù)組第一 ...
  1. uchar add=0;
  2. uchar dis[]={0xAA,addr1,0x01,0xFF};

  3. /*****主程序*****/
  4. void main()
  5. {
  6.                         int i;
  7.       Uart_Init();
  8.            while(1)
  9.                         {
  10.                                 for(i=0;i<4;i++)
  11.                                 {
  12.                                         SBUF=dis[i];
  13.                                         while(!TI); //等特數(shù)據(jù)傳送
  14.                                         TI=0; //清除數(shù)據(jù)傳送標志

  15.                                 } delayms(500);
  16.                         }
  17. }


  18. //從機
  19. void main()
  20. {
  21.           int tem;
  22.     uchar Data[4],t;
  23.     Uart_Init();
  24. while(1)
  25. {
  26.         //在串口助手檢測程序有沒運行
  27.         tem++;        
  28.         if(tem%10000==0) {
  29.                          SBUF = 0X00;
  30.     while(!TI);//當寫下這句的時候,就不要在中斷函數(shù)里面在寫TI = 0;這句了,不然進入中斷函數(shù)將TI清零之后,程序就會一直卡在這里
  31.     TI = 0;       //在這里將TI清零
  32.    SM2=0;  
  33.         }                    
  34.         //接收數(shù)據(jù)
  35.         for(t=0;t<4;t++)
  36.         {
  37.                 Data[t]=SBUF;
  38.                 while(!RI);
  39.                 RI=0;
  40.                 if(SBUF==0XFF) {
  41.                         SM2=1;
  42.                         t=0;
  43.                 }
  44.                         }
  45.         if(Data[0]==0xAA)
  46.         {
  47.          SBUF = 0X11;
  48.     while(!TI);//當寫下這句的時候,就不要在中斷函數(shù)里面在寫TI = 0;這句了,不然進入中斷函數(shù)將TI清零之后,程序就會一直卡在這里
  49.     TI = 0;       //在這里將TI清零
  50.         }

  51. }
復(fù)制代碼
回復(fù)

使用道具 舉報

ID:646224 發(fā)表于 2019-11-21 13:21 | 顯示全部樓層
//從機 void main() {           int tem;     uchar Data[4],t;     Uart_Init(); while(1) {         //在串口助手檢測程序有沒運行         tem++;                 if(tem%10000==0) {                          SBUF = 0X00;      while(!TI);//當寫下這句的時候,就不要在中斷函數(shù)里面在寫TI = 0;這句了,不然進入中斷函數(shù)將TI清零之后,程序就會一直卡在這里     TI = 0;       //在這里將TI清零    SM2=0;           }                             //接收數(shù)據(jù)         for(t=0;t<4;t++)         {                 Data[t]=SBUF;                 while(!RI);                 RI=0;                 if(SBUF==0XFF) {                         SM2=1;                         t=0;                 }                         }         if(Data[0]==0xAA)         {          SBUF = 0X11;     while(!TI);//當寫下這句的時候,就不要在中斷函數(shù)里面在寫TI = 0;這句了,不然進入中斷函數(shù)將TI清零之后,程序就會一直卡在這里     TI = 0;       //在這里將TI清零         }  }
回復(fù)

使用道具 舉報

ID:646224 發(fā)表于 2019-11-21 13:22 | 顯示全部樓層
//主機 uchar add=0; uchar dis[]={0xAA,addr1,0x01,0xFF};  /*****主程序*****/ void main() {                         int i;       Uart_Init();            while(1)                         {                                 for(i=0;i<4;i++)                                 {                                         SBUF=dis[i];                                         while(!TI); //等特數(shù)據(jù)傳送                                         TI=0; //清除數(shù)據(jù)傳送標志                                  } delayms(500);                         } }
回復(fù)

使用道具 舉報

ID:646224 發(fā)表于 2019-11-21 13:37 | 顯示全部樓層

現(xiàn)在卡在從機的接受數(shù)據(jù)上,在編寫好接受程序之后,我試著用串口助手去發(fā)送0XAA 看是否有反應(yīng),結(jié)果一動不動。
回復(fù)

使用道具 舉報

ID:646224 發(fā)表于 2019-11-21 13:47 | 顯示全部樓層

主機發(fā)送的數(shù)組數(shù)據(jù)

主機發(fā)送的數(shù)組數(shù)據(jù)
這是主機給串口發(fā)送的數(shù)組數(shù)據(jù),但是從機是否接受到 或者接受是否正確就無法考證。現(xiàn)在試著用PC端的RX TX 和主機的RX TX 并  然后 連到一個從機的TX RX上面, 結(jié)果,還是沒有反應(yīng),大神們,還有其他的測試思路?

回復(fù)

使用道具 舉報

ID:25310 發(fā)表于 2019-11-21 15:41 | 顯示全部樓層
void UART1_RX (void) interrupt 4   using 2
{
    if(RI)
    {
      RI = 0;
                       
                if(SBUF==0x55)        RX1_Cnt = 0;                       
        RX1_Buffer0[RX1_Cnt] = SBUF;
                         
        if(++RX1_Cnt >= 5)  
                                        {
                                                RX1_Cnt = 0;
                                               
                                  }
       
    }

    if(TI)
                       
    {
    TI = 0;
                busy=0;       
    }
               
}

void  dataCompare( )
{
if(((RX1_Buffer0[0] ==0x55)&&(RX1_Buffer0[4] ==0xaa))&&(
                  (RX1_Buffer0[1]==地址)))

  {
   數(shù)據(jù)處理;
  }

}
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表