#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h"
#include "sensor_drv/sensor.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****点对点通讯地址设置******/
//主节点
#define RF_CHANNEL 22 // 频道 11~26
#define PAN_ID 0x8888 //网络id
#define MY_ADDR 0x1015 //本机模块地址
#define SEND_ADDR 0xAC3A //发送地址
/**************************************************/
#define D3 P1_0
#define SW1 P1_2
void init(void)
{
P1SEL &=~0X01;
P1DIR |=0X01;
D3=0;
}
uint8 scankey()
{
if(SW1==0)
{
if(SW1==0)
{
while(!SW1);
return 1;
}
}
return 0;
}
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.myAddr = MY_ADDR;
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
init();
uint8 i=0;
while(1)
{
/* user code start */
uint8 rxdata_z2[2]={4,3};//切换状态--按键
uint8 rxdata_zchar[10]={0};
uint8 rxdata_zint[2];
if(halUartRead(rxdata_zchar,3)==1)
{
rxdata_zint[i++]=rxdata_zchar[0]-0x30;
}
if(i==2)
{
i=0;
D3=!D3;
basicRfSendPacket(SEND_ADDR,rxdata_zint,2);
}
if(scankey()==1)
{
basicRfSendPacket(SEND_ADDR,rxdata_z2,2);
}
/* user code end */
}
}
上面这道题是利用点对点简单通讯写的串口收发实验。
这样写的接收函数就会显示从串口一个字节找一个字节读取,这样在后面的与利用adc检测光电传感器的实验会造成实验现象延迟,或者没反应,所以我在接下来的实验中我测试了新的串口读取函数。
#include "hal_defs.h"
#include "hal_cc8051.h"
#include "hal_int.h"
#include "hal_mcu.h"
#include "hal_board.h"
#include "hal_led.h"
#include "hal_rf.h"
#include "basic_rf.h"
#include "hal_uart.h"
#include "sensor_drv/sensor.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
/*****点对点通讯地址设置******/
//主节点
#define RF_CHANNEL 22 // 频道 11~26
#define PAN_ID 0x8888 //网络id
#define MY_ADDR 0x0001 //本机模块地址
#define SEND_ADDR1 0x0002 //发送地址1--led报警
#define SEND_ADDR2 0x0003 //发送地址2--led1
#define SEND_ADDR3 0x0004 //发送地址3--led2
/**************************************************/
#define D3 P1_0
uint16 gz;
uint8 gz0[1]={0};
uint8 gz1[1]={1};
uint8 flag1=0;//实时变化的
uint8 flag2=0;//用来检测变化的
static basicRfCfg_t basicRfConfig;
// 无线RF初始化
void ConfigRf_Init(void)
{
basicRfConfig.panId = PAN_ID;
basicRfConfig.channel = RF_CHANNEL;
basicRfConfig.myAddr = MY_ADDR;
basicRfConfig.ackRequest = TRUE;
while(basicRfInit(&basicRfConfig) == FAILED);
basicRfReceiveOn();
}
void init(void)
{
P1SEL &=~0X01;
P1DIR |=0X01;
D3=1;
}
void guangzhao(void)
{
gz=get_guangdian_ad();
if(gz<=30)
flag1=1;
else
flag1=0;
if(flag1!=flag2)
{
flag2=flag1;
if(flag2==1)
basicRfSendPacket(SEND_ADDR1,gz1,1);
if(flag2==0)
basicRfSendPacket(SEND_ADDR1,gz0,1);
}
}
void main(void)
{
halBoardInit();//选手不得在此函数内添加代码
ConfigRf_Init();//选手不得在此函数内添加代码
init();
uint8 txdata_uchar[10]={0};
uint8 txdata_int[2];
uint16 nLen=0;
while(1)
{
/* user code start */
nLen=halUartRxLen();
if(halUartRead(txdata_uchar,nLen))
{
halUartWrite(txdata_uchar,2);
txdata_int[0]=txdata_uchar[0]-0x30;
txdata_int[1]=txdata_uchar[1]-0x30;
if(txdata_int[0]==1)//也就是向节点2发送10 / 11
basicRfSendPacket(SEND_ADDR2,txdata_int,2);
else if(txdata_int[0]==2)也就是向节点3发送 20 /21
basicRfSendPacket(SEND_ADDR3,txdata_int,2);
}
halMcuWaitMs(500);
guangzhao();
/* user code end */
}
}
原来我们在halUartRead(uint8* array,uint16 len);
函数中后面加入一个延迟函数HalMcuWaitMs(100);就可以完全接受这个数组,这种操作我也不知道怎么造成的,如果有大佬知道,请告知。