找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2355|回复: 11
收起左侧

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

[复制链接]
ID:646224 发表于 2019-11-21 01:00 来自手机 | 显示全部楼层 |阅读模式
现在采用的是stc12c5a60s2的单片机作为主机,其余六块作为从机! 主机以广播的方式发送数组数据,其中包括帧头+地址+命令+帧尾共四个字节,而且是不断发送! 在串口助手上可以看到对应的输出。
  问题来了,我现在从机需要接受数据并且用接受到的地址与自身比对,成功就执行接受到的数组数据的第三位命令位对应的命令。 这个就是没有成功。不知道坛友们有没好的方法?

急用,求大佬指点
回复

使用道具 举报

ID:25310 发表于 2019-11-21 08:07 | 显示全部楼层
从机接收端要识别接收,比如一帧数据为:55 01 02 aa ,  55 和AA是头尾,串口接收时丛55开始才放到数组第一个位置,依次接收到最后AA就是一帧数据。开始不是55 的直接退出不接收这样就避免收到错误的数据。
回复

使用道具 举报

ID:138097 发表于 2019-11-21 08:14 | 显示全部楼层
看上去理论是没有问题的,不过实际操作会不会哪步出现问题,排查一下啊,从机仿真看一下接收到没有
回复

使用道具 举报

ID:306810 发表于 2019-11-21 08:42 | 显示全部楼层
主机发送成功了?在串口助手上能够监控到数据了?以上都成功了,那么从机有成功收到数据么?如果有,那么就是你的程序处理报文的问题了。
回复

使用道具 举报

ID:470332 发表于 2019-11-21 08:59 | 显示全部楼层
1、首先,你试试一对一通信能不能正确接收
2、如果只接收理论上是可以的
3、如果从机还需要发送,如果直接把TX RX并在了主机上,这样应该不行,你从机的TX不能接在一起
回复

使用道具 举报

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: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: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: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:37 | 显示全部楼层

现在卡在从机的接受数据上,在编写好接受程序之后,我试着用串口助手去发送0XAA 看是否有反应,结果一动不动。
回复

使用道具 举报

ID:646224 发表于 2019-11-21 13:47 | 显示全部楼层

主机发送的数组数据

主机发送的数组数据
这是主机给串口发送的数组数据,但是从机是否接受到 或者接受是否正确就无法考证。现在试着用PC端的RX TX 和主机的RX TX 并  然后 连到一个从机的TX RX上面, 结果,还是没有反应,大神们,还有其他的测试思路?

回复

使用道具 举报

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]==地址)))

  {
   数据处理;
  }

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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