热度 1
上一期熟悉了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);
}
经调试;可实现无线收发