初始版本

This commit is contained in:
xiaozhengsheng
2025-08-19 09:49:41 +08:00
parent 10f1ddf1c1
commit 6df0f7d96e
2974 changed files with 1712873 additions and 54 deletions

817
app/Src/drv_uart.c Normal file
View File

@@ -0,0 +1,817 @@
/********************************************************************
Copyright (c) 2021 Xiangyu Medical Co.Ltd. All rights reserved.
FileName : drv_uart.c
Author : zhangdawei
Version : V1.0
Date :
Note :
History :
********************************************************************/
/* Includes ------------------------------------------------------*/
#include "drv_uart.h"
#include "pca10040.h"
#include "ble_nus.h"
#include "time.h"
#include "IoControl.h"
#include "nrf_drv_timer.h"
#include "fds.h"
/* Private define ------------------------------------------------*/
BLE_NUS_DEF(m_nus); //定义名称为m_nus的串口透传服务实例
/* Private typedef -----------------------------------------------*/
/* Private constants ---------------------------------------------*/
/* 接收到的方案信息 */
SchemeData_t SchemeData;
SchemeData_t PreStorageSchemeData;// 设备预存信息
uint16_t m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3; /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
/* Private variables ---------------------------------------------*/
//该变量用于保存连接句柄,初始值设置为无连接
uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID;
/* 电池电量的原始值 */
nrf_saadc_value_t Battery_Saadc_Value = 10000;
/* 电池电压百分比 */
uint8_t Battery_Percentage = 100;
/* 肌电采集定时器初始化标志 */
uint8_t TimerEegAdcInit_Flag = 0;
/* 控制电流标志 */
uint8_t CurrentFlag = 0;
/* 设备的连接状态 */
ConnectStateInfo_e DeviceConnectState = DisconnectState;
ElectrodeStatusInfo_e ElectrodeStatusInfo = ElectrodeConnectted;
ElectrodeStatusInfo_e LastElectrodeStatusInfo = ElectrodeConnectted;
/* 适配器连接状态 */
AdapterStateInfo_e AdapterState = AdapterNotConnected;
AdapterStateInfo_e LastAdapterState = AdapterNotConnected;
/* MAC地址数组 */
uint8_t BLE_MAC[BLE_GAP_ADDR_LEN];
//定义FDS异步操作标志结构体
my_fds_info_t my_fds_info;
// 初始化参数信息
SchemePara_t SchemePara = {
.text = 0
};
uint16_t ccrvaluebuf[70] = {
23,25,27,29,31,33,35,37,39,41, //1-10
43,45,47,50,52,54,56,58,60,63, //11-20
65,67,69,71,74,76,78,80,82,85, //21-30
87,89,91,93,95,97,99,101,103,105, //31-40
108,111,114,117,120,123,126,129,132,134, //41-50
136,138,140,142,144,146,148,150,152,154, //51-60
155,156,158,160,162,164,167,170,172,174 //61-70
};
#define EEG_DATA_LENGTH ( 50 )
uint8_t aEEGData[EEG_DATA_LENGTH] = {
23,25,27,29,31,33,35,37,39,41,
43,45,47,50,52,54,56,58,60,63,
65,67,69,71,74,76,78,80,82,85,
87,89,91,93,95,97,99,101,103,105,
108,111,114,117,120,123,126,129,132,134
};
uint8_t eegmode = 0;
uint8_t eegflag = 0;
StimStateInfo_t ChannelStimStateInfo_t;
rms_data_t rmsData = {.frameHeader = FRAME_HEADER,
.frameLength = sizeof(rmsData) - 4, //减去帧头、帧长度、校验和、帧尾
.functionCode = D_EMG_DATA_REPORT,
.myNumber = 0x01,
.channel = 0x01,
//.rmsDataBuffer = {0},
.checkSum = 0,
.frameTail = FRAME_TAIL
};
/* Private function prototypes -----------------------------------*/
void StatusInquiry(ElectrodeStatusInfo_e Electrodestatus);
void StartStopCtrl(uint8_t StartStopValue);
void MACQuery(void);
/* Public constants ----------------------------------------------*/
/* Public variables ----------------------------------------------*/
/********************************************************************
* name : void SetFreqWidth(uint8_t* AnalysisDataBffer_t)
* description : 设置脉冲频率
* Input : AnalysisDataBffer_t接收到的数据缓冲区
* Output : void
* Return : void
********************************************************************/
void SetFreqWidth(uint8_t* AnalysisDataBffer_t)
{
}
/********************************************************************
* name : void SetRampTime(uint8_t* AnalysisDataBfferIn_t)
* description : 设置斜坡时间
* Input : AnalysisDataBffer_t接收到的数据缓冲区
* Output : void
* Return : void
********************************************************************/
void SetRampTime(uint8_t* AnalysisDataBffer_t)
{
}
/********************************************************************
* name : void SetStimPara(uint8_t* AnalysisDataBfferIn_t)
* description : 设置刺激参数
* Input : AnalysisDataBffer_t接收到的数据缓冲区
* Output : void
* Return : void
********************************************************************/
void SetStimPara(uint8_t* AnalysisDataBffer_t)
{
//开启采集模式
if(1 == AnalysisDataBffer_t[4])
{
eegmode = 1;
return;
}
}
/********************************************************************
* name : static void nus_data_handler(ble_nus_evt_t * p_evt)
* description : BLE串口透传事件回调函数
* Input : ble_nus_evt_t * p_evt发生的事件
* Output : void
* Return : void
********************************************************************/
static void nus_data_handler(ble_nus_evt_t * p_evt)
{
uint8_t FrameLength = 0;//帧长度
uint8_t FunctionCode = 0;//功能码
uint8_t CheckSum = 0;//校验和
uint8_t Sum = 0;//数据和
uint8_t SumCCR = 0;//CCR值
#define RX_BLE_DATA_LEN 100
uint8_t RecieveData[RX_BLE_DATA_LEN] = {0}; //接收数据帧的数组
if(p_evt->type == BLE_NUS_EVT_RX_DATA)
{
uint16_t Length = 0;
Length = p_evt->params.rx_data.length;
if(Length > RX_BLE_DATA_LEN)
{
NRF_LOG_ERROR("RecieveData length error");
return;
}
else
{
memcpy(RecieveData, p_evt->params.rx_data.p_data, Length);
}
/* 解析蓝牙收到的数据 */
if(0xAA == RecieveData[0])
{
FrameLength = RecieveData[1]; //帧长度
if(FrameLength > (RX_BLE_DATA_LEN - 4))
{
NRF_LOG_ERROR("RecieveData length error %d", FrameLength);
return;
}
else if(0x55 != RecieveData[FrameLength + 3]) //查找帧尾
{
NRF_LOG_ERROR("RecieveData end flag error");
return;
}
CheckSum = RecieveData[FrameLength + 2]; //校验和
//if(0x55 == RecieveData[FrameLength + 3]) //查找帧尾
{
/*校验数据包*/
for(uint8_t i = 0; i < FrameLength; i++)
{
Sum += RecieveData[i+2];
}
SumCCR = Sum & 0xff;
if(CheckSum == SumCCR)
{
FunctionCode = RecieveData[2];
/*模式、脉宽、频率、斜坡时间设置*/
if(STIM_PARA_CONTROL == FunctionCode)
{
SetStimPara(RecieveData); //设置参数
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
}
/*电流控制 (控制刺激强度)*/
else if(CURRENT_CONTROL == FunctionCode)
{
NRF_LOG_INFO("CURRENT_CONTROL");
// SetStandardCurrent(RecieveData); //设置电流
// CurrentFlag = 1; //设置电流的标志此标志为1时表示可以输出电流
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
}
/*刺激启停控制*/
else if(START_STOP_CONTROL == FunctionCode)
{
NRF_LOG_INFO("START_STOP_CONTROL");
// CurrentFlag = 0; //此标志清0此时开启电流的标志由通道模式和通道状态控制
uint8_t StartStopValue = CH_STOP; //初始状态为停止
StartStopValue = RecieveData[StartStopOffset]; //设置启停状态
StartStopCtrl(StartStopValue); //启停控制
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
}
/*触发采集开始*/
else if(TRIG_COLLECT_START_CONTROL == FunctionCode)
{
NRF_LOG_INFO("TRIG_COLLECT_START_CONTROL");
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
}
/*触发刺激开始*/
else if(TRIG_STIM_START_CONTROL == FunctionCode)
{
NRF_LOG_INFO("TRIG_STIM_START_CONTROL");
ble_nus_data_send(&m_nus, RecieveData, &Length, m_conn_handle);//将收到的数据回复回去
}
/*轮询0x8A*/
else if(STATUS_INQUIRY == FunctionCode)
{
StatusInquiry(ElectrodeStatusInfo);
NRF_LOG_INFO("STATUS_INQUIRY");
}
/* 运行轮询 */
else if(RUN_ROLL == FunctionCode)
{
RunRoll();
NRF_LOG_INFO("RUN_ROLL");
}
/* 版本查询 */
else if(VERSION_INQUIRY == FunctionCode)
{
CheckVersion();
NRF_LOG_INFO("VERSION_INQUIRY");
}
else if(SCHEME_QUERY == FunctionCode)
{
//SchemeQuery();
my_fds_info.read = true;
NRF_LOG_INFO("SCHEME_QUERY");
}
else if(MAC_QUERY == FunctionCode)
{
MACQuery();
}
}
}
}
/***********end***********/
}
}
/********************************************************************
* name : void service_nus_init(void)
* description : 串口透传服务初始化
* Input : void
* Output : void
* Return : void
********************************************************************/
void service_nus_init(void)
{
ret_code_t err_code;
ble_nus_init_t nus_init; //定义串口透传初始化结构体
/*------------------以下代码初始化串口透传服务-------------*/
memset(&nus_init, 0, sizeof(nus_init)); //清零串口透传服务初始化结构体
nus_init.data_handler = nus_data_handler; //设置串口透传事件回调函数
err_code = ble_nus_init(&m_nus, &nus_init); //初始化串口透传服务
APP_ERROR_CHECK(err_code);
/*------------------初始化串口透传服务-END-----------------*/
}
/********************************************************************
* name : void StartStopCtrl(uint8_t ucStartStopValueIn)
* description : 启、停控制处理函数
* Input : ucStartStopValueIn启、停控制值
ucChannelIn通道号
* Output : void
* Return : void
********************************************************************/
void StartStopCtrl(uint8_t StartStopValue)
{
switch(StartStopValue)
{
case CH_START: StartManage();
break;
case CH_PAUSE: PauseManage();
break;
case CH_CONTINUE: RecoverManage();
break;
case CH_STOP: StopManage();
break;
default: break;
}
}
/********************************************************************
* name : void StartManage(void)
* description : 开始处理函数
* Input : void
* Output : void
* Return : void
********************************************************************/
void StartManage(void)
{
if(eegmode == 1)
{
eegflag = 1;
}
}
/********************************************************************
* name : void PauseManage(void)
* description : 暂停处理函数
* Input : Channel通道号
* Output : void
* Return : void
********************************************************************/
void PauseManage(void)
{
if(eegmode == 1)
{
eegflag = 0;
}
// CHAChannelState_e = IdleState; //设置状态为空闲态空闲状态下pwm_flag置0
// ChannelStimStateInfo_t.ChannelWorkState = Pause;
// PwmDACStop();
// CloseOutput(); //关闭输出
// NRF_LOG_INFO("Pause_Stim");
}
/********************************************************************
* name : void CloseOutput(void)
* description : 将输出电流置0斜坡时间置0,关闭输出PWM
* Input : void
* Output : void
* Return : void
********************************************************************/
void CloseOutput(void)
{
if(eegmode == 1)
{
eegmode = 0;
eegflag = 0;
}
//ChannelStimStateInfo_t.ucCurrent = 0;
// ChannelStimStateInfo_t.Ramp_e = RampIdle;//斜坡状态为空闲态
// RampTime = 0; //斜坡时间清0
// SetCurrent(0); //设置输出电流为0
// PwmSubtractStop(); //关闭输出PWM
// PwmDACStop(); //停止充能PWM
//// GpioteInit();
}
/********************************************************************
* name : void RecoverManage(void)
* description : 继续处理函数
* Input : void
* Output : void
* Return : void
********************************************************************/
void RecoverManage(void)
{
if(eegmode == 1)
{
eegflag = 1;
}
}
/********************************************************************
* name : void StopManage(void)
* description : 停止处理函数
* Input : void
* Output : void
* Return : void
********************************************************************/
void StopManage(void)
{
}
/********************************************************************
* name : void SetStandardCurrent(uint8_t* AnalysisDataBfferIn_t)
* description : 设置标称电流值
* Input : AnalysisDataBfferIn_t接收到的数据缓冲区
* Output : void
* Return : void
********************************************************************/
void SetStandardCurrent(uint8_t* AnalysisDataBffer_t)
{
}
/********************************************************************
* name : void StatusInquiry(void)
* description : 状态轮询
* Input : void
* Output : void
* Return : void
********************************************************************/
void StatusInquiry(ElectrodeStatusInfo_e Electrodestatus)
{
uint8_t j = 2;
static uint8_t aTxBuffer[10] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 10;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x06;
aTxBuffer[FunctionCodeOffset] = STATUS_INQUIRY;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[ElectrodeStatusOffset] = 0x01;
aTxBuffer[StimStatusOffset] = ChannelStimStateInfo_t.Ramp_e;
aTxBuffer[StimCurrentOffset] = ChannelStimStateInfo_t.ucCurrent;
aTxBuffer[ResetOffset] = 0x00;
aTxBuffer[TailOffset] = 0x55;
/* 校验和 */
for(uint8_t i = 0; i < 6; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[DataCrcOffset] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : uint8_t caculate_sum_check(void)
* description : 运行校验和计算
* Input : typeStructHeader数据结构头部
typeStructLength数据结构长度
* Output : void
* Return : 计算结果
********************************************************************/
uint8_t caculate_sum_check(uint8_t *typeStructHeader, uint8_t typeStructLength)
{
uint8_t sum = 0;
uint8_t * typeStructCMD = &typeStructHeader[2];
for (uint8_t i = 0; i < typeStructLength; i++)
{
sum += typeStructCMD[i];
}
return sum&0xFF;
}
/// @brief 运行状态回复
reply_run_status_t replyRunStatus = {
.frameHeader = FRAME_HEADER,
.frameLength = sizeof(replyRunStatus) - 4, //减去帧头、帧长度、校验和、帧尾
.functionCode = RUN_ROLL,
.myNumber = 0x01,
.channel = 0x01,
.checkSum = 0,
.frameTail = FRAME_TAIL
};
/********************************************************************
* name : void RunRoll(void)
* description : 运行轮询
* Input : void
* Output : void
* Return : void
********************************************************************/
void RunRoll(void)
{
uint32_t ulCrc = 0;
uint16_t Length = sizeof(replyRunStatus);
replyRunStatus.ChargeState = ChargeState;
replyRunStatus.BatteryLevelA = Battery_Percentage;
replyRunStatus.checkSum = (uint8_t)caculate_sum_check((uint8_t *)&replyRunStatus, replyRunStatus.frameLength);
ble_nus_data_send(&m_nus, &replyRunStatus.frameHeader, &Length, m_conn_handle);
}
/********************************************************************
* name : void CheckVersion(void)
* description : 版本查询
* Input : void
* Output : void
* Return : void
********************************************************************/
check_version_t checkVersion = {
.frameHeader = FRAME_HEADER,
.frameLength = sizeof(checkVersion) - 4, //减去帧头、帧长度、校验和、帧尾
.functionCode = VERSION_INQUIRY,
.myNumber = 0x01,
.channel = 0x01,
.checkSum = 0,
.frameTail = FRAME_TAIL
}
void CheckVersion(void)
{
uint8_t j = 2;
static uint8_t aTxBuffer[21] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 21;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x11;
aTxBuffer[FunctionCodeOffset] = VERSION_INQUIRY;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[20] = 0x55;
/* 协议中规定先发送高字节,后发送低字节 */
aTxBuffer[4] = VersionDes[0];
aTxBuffer[5] = VersionDes[1];
aTxBuffer[6] = VersionDes[2];
aTxBuffer[7] = VersionDes[3];
aTxBuffer[8] = VersionDes[4];
aTxBuffer[9] = VersionDes[5];
aTxBuffer[10] = VersionDes[6];
aTxBuffer[11] = VersionDes[7];
aTxBuffer[12] = 0x00;
aTxBuffer[13] = 0x00;
aTxBuffer[14] = 0x00;
aTxBuffer[15] = 0x00;
aTxBuffer[16] = 0x00;
aTxBuffer[17] = 0x00;
aTxBuffer[18] = 0x00;
/* 校验和 */
for(uint8_t i = 0; i < 17; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[19] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : void EegDataSend(void)
* description : 发送肌电数据
* Input : void
* Output : void
* Return : void
********************************************************************/
void EegDataSend(void)
{
uint8_t j = 2;
static uint8_t aTxBuffer[EEG_DATA_LENGTH+6] = {0};
uint32_t ulCrc = 0;
uint16_t Length = EEG_DATA_LENGTH+6;
ret_code_t err_code;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x34;
aTxBuffer[FunctionCodeOffset] = EEG_DATA;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[EEG_DATA_LENGTH+5] = 0x55;
/* 协议中规定先发送高字节,后发送低字节 */
memcpy(&aTxBuffer[4],aEEGData,EEG_DATA_LENGTH);
/* 校验和 */
for(uint8_t i = 0; i < EEG_DATA_LENGTH+2; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[EEG_DATA_LENGTH+4] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : void UpdateCurrent(uint8_t CurrentSend)
* description : 同步电流
* Input : void
* Output : void
* Return : void
********************************************************************/
void UpdateCurrent(uint8_t CurrentSend)
{
uint8_t j = 2;
uint8_t aTxBuffer[8] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 8;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x04;
aTxBuffer[FunctionCodeOffset] = CURRENT_CONTROL;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[7] = 0x55;
/* 协议中规定先发送高字节,后发送低字节 */
aTxBuffer[4] = CurrentSend;
aTxBuffer[5] = 0x01; // 01代表蓝牙设备发送
/* 校验和 */
for(uint8_t i = 0; i < 4; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[6] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
void user_ble_or_uart_send(char * txBufferP, uint16_t Length)
{
ble_nus_data_send(&m_nus, txBufferP, &Length, m_conn_handle);
}
/********************************************************************
* name : void ble_send_rms_data(uint16_t rms_data)
* description : 发送肌电数据到主机
* Input : uint16_t rms_data肌电数据
* Output : void
* Return :
********************************************************************/
void ble_send_rms_data(uint16_t rms_data)
{
uint32_t TempSum = 0;
static uint8_t sendCnt = 0;
if(sendCnt < RMS_USER_DATA_LENGTH)
{
rmsData.rmsDataBuffer[sendCnt] = rms_data; //将rms_data存入rmsData的rmsDataBuffer数组中
sendCnt++;
if(sendCnt < RMS_USER_DATA_LENGTH)
return ; //如果发送次数小于RMS_USER_DATA_LENGTH则不发送
}
sendCnt = 0; //发送次数达到RMS_USER_DATA_LENGTH后重置发送次数
rmsData.myNumber = 1;
//rmsData.myNumber++;
uint8_t * sumCheckStartP = (uint8_t *)&rmsData.functionCode;
for(uint8_t i = 0; i < rmsData.frameLength; i++)
{
TempSum += sumCheckStartP[i];
}
rmsData.checkSum = TempSum & 0xff;
user_ble_or_uart_send((uint8_t *)&rmsData, sizeof(rmsData)); //145us
}
/********************************************************************
* name : void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp)
* description : 电极片和适配器状态上传
* Input : AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp
* Output : void
* Return : void
********************************************************************/
void StateUpLoad(AdapterStateInfo_e AdapterStateTemp , ElectrodeStatusInfo_e ElectrodeStatusTemp)
{
uint8_t j = 2;
uint8_t aTxBuffer[8] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 8;
AdapterStateInfo_e AdapterStateIn;
ElectrodeStatusInfo_e ElectrodeStatusIn;
AdapterStateIn = AdapterStateTemp;
ElectrodeStatusIn = ElectrodeStatusTemp;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x04;
aTxBuffer[FunctionCodeOffset] = STATE_UPLOAD;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[7] = 0x55;
aTxBuffer[4] = AdapterStateIn; // 适配器连接状态
aTxBuffer[5] = ElectrodeStatusIn; // 电极片状态
if(ElectrodeStatusIn == ElectrodeFalloff)
{
ElectrodeStatusInfo = ElectrodeConnectted;
}
NRF_LOG_INFO("Electrodestatus = %d",ElectrodeStatusIn);
/* 校验和 */
for(uint8_t i = 0; i < 4; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[6] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : void UpdateControlStatus(uint8_t ControlStatus)
* description : 同步电流
* Input : void
* Output : void
* Return : void
********************************************************************/
void UpdateControlStatus(uint8_t ControlStatus)
{
uint8_t j = 2;
uint8_t aTxBuffer[8] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 8;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x04;
aTxBuffer[FunctionCodeOffset] = START_STOP_CONTROL;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[7] = 0x55;
/* 协议中规定先发送高字节,后发送低字节 */
aTxBuffer[4] = ControlStatus;
aTxBuffer[5] = 0x01; // 01代表蓝牙设备发送
/* 校验和 */
for(uint8_t i = 0; i < 4; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[6] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : void SchemeQuery(uint8_t idMSB,uint8_t idLSB)
* description : 方案查询
* Input : void
* Output : void
* Return : void
********************************************************************/
void SchemeQuery(uint8_t idMSB,uint8_t idLSB)
{
uint8_t j = 2;
static uint8_t aTxBuffer[8] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 8;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x04;
aTxBuffer[FunctionCodeOffset] = SCHEME_QUERY;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[7] = 0x55;
/* 协议中规定先发送高字节,后发送低字节 */
aTxBuffer[4] = idMSB;
aTxBuffer[5] = idLSB;
/* 校验和 */
for(uint8_t i = 0; i < 4; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[6] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : void MACQuery(void)
* description : MAC地址查询
* Input : void
* Output : void
* Return : void
********************************************************************/
void MACQuery(void)
{
uint8_t j = 2;
static uint8_t aTxBuffer[12] = {0};
uint32_t ulCrc = 0;
uint16_t Length = 12;
/* 帧头、帧尾*/
aTxBuffer[HeadOffset] = 0xAA;
aTxBuffer[DataLengthOffset] = 0x08;
aTxBuffer[FunctionCodeOffset] = MAC_QUERY;
aTxBuffer[ChannelNumOffset] = 0x00;
aTxBuffer[11] = 0x55;
aTxBuffer[4] = BLE_MAC[5];
aTxBuffer[5] = BLE_MAC[4];
aTxBuffer[6] = BLE_MAC[3];
aTxBuffer[7] = BLE_MAC[2];
aTxBuffer[8] = BLE_MAC[1];
aTxBuffer[9] = BLE_MAC[0];
/* 校验和 */
for(uint8_t i = 0; i < 8; i++)
{
ulCrc += aTxBuffer[j];
j++;
}
aTxBuffer[10] = (uint8_t)ulCrc;
ble_nus_data_send(&m_nus, aTxBuffer, &Length, m_conn_handle);
}
/********************************************************************
* name : void JudgeLedMode(void)
* description :
* Input : void
* Output : void
* Return : void
********************************************************************/
void JudgeLedMode(void)
{
}
void DisconnectControl(void)
{
StopManage();
}
/*************************** END OF FILE ***************************/