找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

51单片机进行一个主机对对多个从机广播

查看数: 3231 | 评论数: 11 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-11-21 01:00

正文摘要:

现在采用的是stc12c5a60s2的单片机作为主机,其余六块作为从机! 主机以广播的方式发送数组数据,其中包括帧头+地址+命令+帧尾共四个字节,而且是不断发送! 在串口助手上可以看到对应的输出。   问题来 ...

回复

ID:25310 发表于 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]==地址)))

  {
   数据处理;
  }

}
ID:646224 发表于 2019-11-21 13:37

现在卡在从机的接受数据上,在编写好接受程序之后,我试着用串口助手去发送0XAA 看是否有反应,结果一动不动。
ID:646224 发表于 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); //等特数据传送                                         TI=0; //清除数据传送标志                                  } delayms(500);                         } }
ID:646224 发表于 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);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里     TI = 0;       //在这里将TI清零    SM2=0;           }                             //接收数据         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);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里     TI = 0;       //在这里将TI清零         }  }
ID:646224 发表于 2019-11-21 13:20
pcbboy 发表于 2019-11-21 08:07
从机接收端要识别接收,比如一帧数据为:55 01 02 aa ,  55 和AA是头尾,串口接收时丛55开始才放到数组第一 ...
  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); //等特数据传送
  14.                                         TI=0; //清除数据传送标志

  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);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里
  31.     TI = 0;       //在这里将TI清零
  32.    SM2=0;  
  33.         }                    
  34.         //接收数据
  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);//当写下这句的时候,就不要在中断函数里面在写TI = 0;这句了,不然进入中断函数将TI清零之后,程序就会一直卡在这里
  49.     TI = 0;       //在这里将TI清零
  50.         }

  51. }
复制代码
ID:617449 发表于 2019-11-21 09:58
1、多机通讯采用 RS485 方式
2、先把一对一的调试好
3、在扩展到6个分机
4、给你看一个 20 点485通讯的
http://www.51hei.com/bbs/dpj-170710-1.html
ID:470332 发表于 2019-11-21 08:59
1、首先,你试试一对一通信能不能正确接收
2、如果只接收理论上是可以的
3、如果从机还需要发送,如果直接把TX RX并在了主机上,这样应该不行,你从机的TX不能接在一起
ID:306810 发表于 2019-11-21 08:42
主机发送成功了?在串口助手上能够监控到数据了?以上都成功了,那么从机有成功收到数据么?如果有,那么就是你的程序处理报文的问题了。
ID:138097 发表于 2019-11-21 08:14
看上去理论是没有问题的,不过实际操作会不会哪步出现问题,排查一下啊,从机仿真看一下接收到没有
ID:25310 发表于 2019-11-21 08:07
从机接收端要识别接收,比如一帧数据为:55 01 02 aa ,  55 和AA是头尾,串口接收时丛55开始才放到数组第一个位置,依次接收到最后AA就是一帧数据。开始不是55 的直接退出不接收这样就避免收到错误的数据。

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表