在逗猫棒的基础上实现蓝牙转USB功能,目前功能已经实现,还需裁剪掉之前逗猫棒的业务程序
This commit is contained in:
@@ -0,0 +1,241 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_PACKETS 12 // 最大包数量
|
||||
#define MAX_PACKET_LEN 128 // 单个包的最大长度
|
||||
|
||||
typedef struct {
|
||||
unsigned char data[MAX_PACKET_LEN]; // 包的数据
|
||||
int length; // 包的长度(包括帧头和校验和)
|
||||
int data_length; // 数据部分的长度(不包括帧头和校验和)
|
||||
int valid; // 校验是否通过
|
||||
} Packet;
|
||||
|
||||
typedef struct {
|
||||
Packet packets[MAX_PACKETS]; // 解析出的包数组
|
||||
int count; // 解析出的包数量
|
||||
int valid_count; // 校验通过的包数量
|
||||
} PacketResult;
|
||||
|
||||
|
||||
// 计算校验和并验证
|
||||
int verify_checksum(const unsigned char* packet_data, int length) {
|
||||
if (length < 3) return 0; // 至少要有帧头+1数据+1校验和
|
||||
|
||||
unsigned char calculated_checksum = 0;
|
||||
// 从帧头开始计算到倒数第二个字节的和
|
||||
for (int i = 0; i < length - 1; i++) {
|
||||
calculated_checksum += packet_data[i];
|
||||
}
|
||||
// 对256取余
|
||||
calculated_checksum %= 256;
|
||||
|
||||
// 比较计算值和包中的校验和(最后一个字节)
|
||||
return (calculated_checksum == packet_data[length - 1]);
|
||||
}
|
||||
|
||||
void parse_packets(const unsigned char* hex_array, int array_length, PacketResult* result) {
|
||||
result->count = 0;
|
||||
result->valid_count = 0;
|
||||
int start_index = -1;
|
||||
|
||||
for (int i = 0; i < array_length - 1 && result->count < MAX_PACKETS; i++) {
|
||||
if (hex_array[i] == 0x55 && hex_array[i + 1] == 0xAA) {
|
||||
if (start_index != -1) {
|
||||
// 保存上一个包的信息
|
||||
int packet_length = i - start_index;
|
||||
if (packet_length > MAX_PACKET_LEN) {
|
||||
packet_length = MAX_PACKET_LEN; // 截断超长包
|
||||
}
|
||||
|
||||
// 复制数据
|
||||
memcpy(result->packets[result->count].data,
|
||||
hex_array + start_index,
|
||||
packet_length);
|
||||
|
||||
// 设置包信息
|
||||
result->packets[result->count].length = packet_length;
|
||||
result->packets[result->count].data_length = packet_length - 3; // 减去帧头和校验和
|
||||
|
||||
// 验证校验和
|
||||
result->packets[result->count].valid = verify_checksum(
|
||||
result->packets[result->count].data,
|
||||
packet_length);
|
||||
|
||||
if (result->packets[result->count].valid) {
|
||||
result->valid_count++;
|
||||
}
|
||||
|
||||
result->count++;
|
||||
}
|
||||
start_index = i;
|
||||
}
|
||||
}
|
||||
|
||||
// 处理最后一个包
|
||||
if (start_index != -1 && start_index < array_length && result->count < MAX_PACKETS) {
|
||||
int packet_length = array_length - start_index;
|
||||
if (packet_length > MAX_PACKET_LEN) {
|
||||
packet_length = MAX_PACKET_LEN;
|
||||
}
|
||||
|
||||
// 复制数据
|
||||
memcpy(result->packets[result->count].data,
|
||||
hex_array + start_index,
|
||||
packet_length);
|
||||
|
||||
// 设置包信息
|
||||
result->packets[result->count].length = packet_length;
|
||||
result->packets[result->count].data_length = packet_length - 3;
|
||||
|
||||
// 验证校验和
|
||||
result->packets[result->count].valid = verify_checksum(
|
||||
result->packets[result->count].data,
|
||||
packet_length);
|
||||
|
||||
if (result->packets[result->count].valid) {
|
||||
result->valid_count++;
|
||||
}
|
||||
|
||||
result->count++;
|
||||
}
|
||||
}
|
||||
void usr_tuya_data_ana(const unsigned char* data,int len);
|
||||
void usr_mcu_data_recieve(const unsigned char* hex_array, int array_length)
|
||||
{
|
||||
PacketResult result;
|
||||
parse_packets(hex_array,array_length,&result);
|
||||
printf("Total packets parsed: %d\n", result.count);
|
||||
printf("Valid packets: %d\n", result.valid_count);
|
||||
|
||||
for (int i = 0; i < result.count; i++) {
|
||||
printf("\nPacket %d: Length=%d, Data Length=%d, Valid=%s\n", i+1,
|
||||
result.packets[i].length,
|
||||
result.packets[i].data_length,
|
||||
result.packets[i].valid ? "Yes" : "No");
|
||||
|
||||
if (result.packets[i].valid) {
|
||||
printf("Data: ");
|
||||
printf_buf(result.packets[i].data, result.packets[i].length);
|
||||
usr_tuya_data_ana(result.packets[i].data,result.packets[i].length);
|
||||
printf("\n");
|
||||
} else {
|
||||
printf("Invalid checksum - Packet ignored\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
//void usr_set_fool_val(unsigned char wei_cnt);
|
||||
extern void usr_data_notify_auto();
|
||||
extern unsigned char usr_weishi_type;
|
||||
extern unsigned char usr_weishi_fenshu;
|
||||
extern void usr_weishi_notify();
|
||||
extern unsigned char usr_led_on_flag;
|
||||
void usr_tuya_data_ana(const unsigned char* data,int len)
|
||||
{
|
||||
switch(data[6])///DP ID
|
||||
{
|
||||
case 0x01:///喂食计划
|
||||
break;
|
||||
case 0x02:///一键喂食
|
||||
break;
|
||||
case 0x03:///手动喂食
|
||||
|
||||
break;
|
||||
case 0x04:///喂食状态
|
||||
switch(data[10])
|
||||
{
|
||||
case 0x00:///就绪
|
||||
usr_weishi_type=0;
|
||||
usr_weishi_fenshu=1;
|
||||
usr_data_notify_auto();
|
||||
break;
|
||||
case 0x01:///正在喂食
|
||||
// usr_set_fool_val(usr_weishi_fenshu);
|
||||
// usr_weishi_notify();
|
||||
break;
|
||||
case 0x02:///喂食结束
|
||||
usr_weishi_type=0;
|
||||
usr_weishi_fenshu=1;
|
||||
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x0a:///电池电量
|
||||
///电池电量=data[13];
|
||||
break;
|
||||
case 0x0b:///充电状态
|
||||
///充电状态=data[10]
|
||||
break;
|
||||
case 0x0d:///故障上报
|
||||
///故障=data[10]
|
||||
/*
|
||||
bit0:food_jam
|
||||
bit1:food_shortages
|
||||
bit2:food_run_out
|
||||
bit3:desiccant
|
||||
bit4:battery_low
|
||||
bit5:device_stuck
|
||||
*/
|
||||
break;
|
||||
case 0x0e:///喂食结果上报
|
||||
break;
|
||||
case 0x11:///状态指示灯应答
|
||||
///LED开关=data[10]
|
||||
usr_led_on_flag=data[10];
|
||||
break;
|
||||
case 0x17:///慢放投喂
|
||||
break;
|
||||
case 0x18:///恢复出厂设置应答
|
||||
break;
|
||||
case 0x1c:///MCU获取BLE模块的本地时间
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
int ana_demo() {
|
||||
// 示例数据
|
||||
unsigned char hex_data[] = {
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x0E, 0x01, 0x00, 0x00, 0x0A, 0x7F, 0x0F, 0x26, 0x01, 0x01, 0x7F, 0x0F, 0x28, 0x01, 0x01, 0x90,
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x08, 0x03, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x1B,
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x04, 0x04, 0x00, 0x01, 0x00, 0x17,
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x08, 0x0A, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x21,
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x0D, 0x05, 0x00, 0x01, 0x00, 0x21,
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x11, 0x01, 0x00, 0x01, 0x01, 0x22,
|
||||
0x55, 0xAA, 0x03, 0x07, 0x00, 0x05, 0x17, 0x01, 0x00, 0x01, 0x00, 0x87,
|
||||
0x55, 0xAA, 0x03, 0x1C, 0x00, 0x00, 0x17
|
||||
};
|
||||
|
||||
int data_length = sizeof(hex_data) / sizeof(hex_data[0]);
|
||||
PacketResult result;
|
||||
|
||||
parse_packets(hex_data, data_length, &result);
|
||||
|
||||
printf("Total packets parsed: %d\n", result.count);
|
||||
printf("Valid packets: %d\n", result.valid_count);
|
||||
|
||||
for (int i = 0; i < result.count; i++) {
|
||||
printf("\nPacket %d: Length=%d, Data Length=%d, Valid=%s\n", i+1,
|
||||
result.packets[i].length,
|
||||
result.packets[i].data_length,
|
||||
result.packets[i].valid ? "Yes" : "No");
|
||||
|
||||
if (result.packets[i].valid) {
|
||||
printf("Data: ");
|
||||
printf_buf(result.packets[i].data, result.packets[i].length);
|
||||
printf("\n");
|
||||
} else {
|
||||
printf("Invalid checksum - Packet ignored\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
Reference in New Issue
Block a user