注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
foreng的个人空间 https://home.eeworld.com.cn/space-uid-146656.html [收藏] [复制] [分享] [RSS]
日志

基于CH2601的LORA无线通信程序

热度 1已有 276 次阅读2022-7-13 18:57

上一期熟悉了CH2601的开发环境,并成功用剑池,实现程序烧录和串口打印,这次准备用CH2601的串口通信能力,实现远距离无线通信,整好手上有亿佰特的E22无线模块,查看说明,其采用串口和主控MCU进行通信,其连接如下图:

   

其发发代码如下:
 


void InitE22(E22RegisterMeaning*E) //初始化本机E22模块的数据。如果为空,则初始化G_LocalE22
{
    if( E == NULL )
        E = &G_LocalE22Meaning;
    
    E->Addr = 0;                                                       
    E->NetID = 0;                                                    
                                                                           
    E->UartSpeed = 9600;
    memset((void*)(E->UartCheckBit),0,4);                                  
    char buf1[4] = "8N1";                                                  
    memcpy(E->UartCheckBit,buf1,3);                                        
    E->AirSpeed = 2400;                                                    
                                                                           
    E->SplitPack = 240;                                                    
    E->EnableRSSINoise = 0;                                                
    E->TransPower = 22;                                                    
                                                                           
    E->Channel = 23;
                                                                           
    E->EnableRSSIPower = 1;         
    E->TransMode = 1;                  
    E->EnableRelay = 0;                                                    
    E->EnableLBT = 0;                                                      
    E->WORMode = 0;//接收方    wor角色                                            
    E->WORCycle = 2000;                                                    
                                                                           
    E->KeyValue = 0;                                                       
                                                                           
    memset(E->PID,0,7);  

    E->WORDelayTime = 2000;//默认为2000毫秒 wor周期
}

 


int GenE22Register(E22RegisterMeaning*E,uint8_t R[20])//根据参数,设置E22模块的寄存器数据        
{                                                                               
    if( E == NULL )
        E = &G_LocalE22Meaning;
    if( R == NULL )
        R = G_E22Register;

    memset(R,0,20);//需要全置0不? ===wuh

    uint8_t*p = NULL;//需要用到的临时指针
    uint8_t c = 0;//要置的位的值
    uint8_t m = 0;//掩码
    
    p = (uint8_t*)&E->Addr;
    R[0] = p[1];    //取高位;但系统中int型又是低位在前
    R[1] = p[0];
    
    R[2] = E->NetID;
    
    c = 0;
    m = 0xE0;
    switch(E->UartSpeed)
    {
        case 1200:
            c = 0x00;   break;
        case 2400:
            c = 0x20;   break;
        case 4800:
            c = 0x40;   break;
        case 9600:
            c = 0x60;   break;
        case 19200:
            c = 0x80;   break;
        case 38400:
            c = 0xA0;   break;
        case 57600:
            c = 0xC0;   break;
        case 115200:
            c = 0xE0;   break;
        default:
            c = 0xE0;   break;
    }
    R[3] &= ~m;
    R[3] |= c;
    
    c = 0;
    m = 0x18;
    E->UartCheckBit[1] = toupper(E->UartCheckBit[1]);

    if( memcmp(E->UartCheckBit,"8N1",3) == 0 )
        c = 0x00;
    else if( memcmp(E->UartCheckBit,"8O1",3) == 0 )
        c = 0x08;
    else if( memcmp(E->UartCheckBit,"8E1",3) == 0 )
        c = 0x10;
    else if( memcmp(E->UartCheckBit,"8N1",3) == 0 )
        c = 0x18;
    R[3] &= ~m;
    R[3] |= c;

    c = 0;
    m = 0x07;
    switch(E->AirSpeed)
    {
        case 300:
            c = 0x00;   break;
        case 1200:
            c = 0x01;   break;
        case 2400:
            c = 0x02;   break;
        case 4800:
            c = 0x03;   break;
        case 9600:
            c = 0x04;   break;
        case 19200:
            c = 0x05;   break;
        case 38400:
            c = 0x06;   break;
        case 62500:
            c = 0x07;   break;
        default:
            c = 0x02;   break;
    }
    R[3] &= ~m;
    R[3] |= c;
    
 


 

    memcpy(R+11,E->PID,7);

    return 0;
}

 


void DoSendTransInfo(void) 
{
    SensorPacket*SP2 = &G_SensorPacket_Send;
        SensorPacket*SP1 = &G_SensorPacket_Rcv;
    uint8_t* buf = malloc(256);
    memset(buf,0,256);

    memcpy(SP2,SP1,sizeof(G_SensorPacket_Send)); 

    //以下是接收方的数据
    SP2->net_addr_rcv = G_RemoteAddr;
    SP2->channel = G_WorkChannel;

    memcpy(SP2->SensorID,G_SensorNo,6);
      
      if( G_rx_pref==0)
    {
            SP2->parameter_num = 0X09;
        }
        else
        {
            SP2->parameter_num = 0X0A;
        }
        
    SP2->is_split = 0;
        
        if( G_ZJ_Flag==0xFE)
        {
    SP2->packet_type = 0x00;
        G_ZJ_status=1;    
        }
        else if (G_ZJ_Flag!=0xFE)
        {
          SP2->packet_type = 0x02;//告警数据报文
            G_ZJ_status=2;
        }    
        
        SP2->packet_type = 0x00;
      SP2->RSSI = SP1->RSSI;
    SP2->SF6_CollectTime     =   G_CollectTime;
    SP2->SF6_rx_vcs          =   G_rx_vcs;              
    SP2->SF6_rx_tdp          =   G_rx_tdp;              
    SP2->SF6_rx_td           =   G_rx_td;                
    SP2->SF6_rx_ppmvp        =   G_rx_ppmvp;            
    SP2->SF6_rx_ppmvp20      =   G_rx_ppmvp20;           
    SP2->SF6_rx_ta           =   G_rx_ta;              
    SP2->SF6_rx_pref         =   G_rx_pref;           
    SP2->SF6_rx_rh           =   G_rx_rh;               
    SP2->SF6_rx_p            =   G_rx_p;                 
    SP2->SF6_rx_p20          =   G_rx_p20;             
    SP2->SF6_rx_den          =   G_rx_den;               
        
    SP2->SF6_ZJ_Flag                 =   G_ZJ_Flag;
    SP2->SF6_v_value         =   G_v_value;              
        SP2->SF6_ZJ_status       =   G_ZJ_status ;         
    SP2->SF6_data_length     =   1;                                 
    printf("trans data:密度%0.2f,温度%0.2f,collect time:%d.,电压: %0.2f",G_rx_den,G_rx_ta,G_CollectTime,G_v_value);
    int len = GenOneSendFrame(buf,SP2);
    if( len>0 )
        HAL_UART_Transmit(&hlpuart1,buf,len,0xFFFF);
    free(buf);
}

 

经调试;可实现无线收发

 

 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章