1653|3

10

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

基于CH2601的LORA无线通信程序 [复制链接]

 

上一期熟悉了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);
}

 

经调试;可实现无线收发

 

 

最新回复

楼主代码可是使用插入代码功能,编辑是上方就有编辑代码选项,会更加直观   详情 回复 发表于 2022-7-14 21:35
点赞 关注
 
 

回复
举报

6861

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

谢谢分享用串口和主控MCU进行通信的代码

 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

感谢楼主分享!                                   

 
 
 

回复

6612

帖子

9

TA的资源

版主

4
 

楼主代码可是使用插入代码功能,编辑是上方就有编辑代码选项,会更加直观

个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表