你好,1)需求方中串口是不是只要收到包,就会触发中断,还是必须收包超过一定量或者时间到了才会触发中断?2)串口中断处理函数期间,串口会丢包吗?还是会继续收报,也就是中断处理函数的执行时间不影响串口收包,收包只和寄存器的数量相关?3)如果串口寄存器全满,又没有操作来读包,串口是不是就是开始丢包了?谢谢
1 .注意到TX_WAIT_LEVEL和TX_WAIT_ROUND这两个参数,用于决定什么时候开启BLE的数据传输2. uart会继续收包,这是硬件直接完成的工作,只不过此时中断被屏蔽,不会触发新的中断。3.是这样的,老的数据就会被覆盖
好的,非常感谢。还有个疑问,我看蓝牙发包那块,一次性最多可以发128个字节吗?#定义TX_SIZE (128)#define TX_WAIT_LEVEL(74) //3数据包(20 + 2*27)#定义TX_WAIT_ROUNDS (10)#定义TX_START_FRAME_DATA_SIZE (20)#定义TX_CONTINUE_FRAME_DATA_SIZE (27)if (length > TX_WAIT_LEVEL || (rounds_waiting++) >= TX_WAIT_ROUNDS){uint8_t *p_data = NULL;
rounds_waiting = 0;tx_busy_flag = true;
1) length = (length > TX_SIZE ?)TX_SIZE:长度);2) length = (length < start_frame_data_size ?length: ((length - start_frame_data_size) / TX_CONTINUE_FRAME_DATA_SIZE) * TX_CONTINUE_FRAME_DATA_SIZE + TX_START_FRAME_DATA_SIZE));3) length = user_buffer_read_address(& p_to_ble_buffer, &p_data, TX_SIZE);user_send_ble_data (p_data、长度);}
还有个很大的疑惑就是这个长度的计算。“1)”我可以理解,保证发包长度不超过最大发包长度;2)”我理解是不是对包进行分片,首包的长度是20字节,之后的都是27个字节,这个设计应该是考虑天线效率的问题吧,而且这个分片也只是让数据长度满足20 + x * 27岁的格式吧?3)”我就非常不理解了,它是根据缓冲区的长度来确定发包长度的,感觉这个完全就把1、2覆盖了。还有,我记得蓝牙数据包的最大长度是不超过27个字节的,串口程序一下子发了128字节,那协议栈会自动分包吗?是不是相当于把数据放在一个缓冲区了?谢谢!
首先,最大长度为27是出于这样的考虑。因为蓝牙4.0的包的数据部分的长度最大为31个字节,由头字段的字段决定(5个点)。由于有可能会涉及到加密,需要额外留出4个字节,用于存储麦克风的数据。所以是27个。
而首个数据包是20个字节,是因为需要留出前面7个字节存储以下信息:> 2字节所有数据包的长度(包含拆包之前的所有数据长度,即20 + 27 * x)> 2字节通道ID(一般对于写操作来说,为0 x0004)>1 byte Command (0x52 - Attribute Opcode - Write Command)> 2字节属性处理(对应你要写的属性处理)
是在协议栈自动分包的
1 .注意到TX_WAIT_LEVEL和TX_WAIT_ROUND这两个参数,用于决定什么时候开启BLE的数据传输
2. uart会继续收包,这是硬件直接完成的工作,只不过此时中断被屏蔽,不会触发新的中断。
3.是这样的,老的数据就会被覆盖
好的,非常感谢。
还有个疑问,我看蓝牙发包那块,一次性最多可以发128个字节吗?
#定义TX_SIZE (128)
#define TX_WAIT_LEVEL(74) //3数据包(20 + 2*27)
#定义TX_WAIT_ROUNDS (10)
#定义TX_START_FRAME_DATA_SIZE (20)
#定义TX_CONTINUE_FRAME_DATA_SIZE (27)
if (length > TX_WAIT_LEVEL || (rounds_waiting++) >= TX_WAIT_ROUNDS)
{
uint8_t *p_data = NULL;
rounds_waiting = 0;
tx_busy_flag = true;
1) length = (length > TX_SIZE ?)TX_SIZE:长度);
2) length = (length < start_frame_data_size ?length: ((length - start_frame_data_size) / TX_CONTINUE_FRAME_DATA_SIZE) * TX_CONTINUE_FRAME_DATA_SIZE + TX_START_FRAME_DATA_SIZE));
3) length = user_buffer_read_address(& p_to_ble_buffer, &p_data, TX_SIZE);
user_send_ble_data (p_data、长度);
}
还有个很大的疑惑就是这个长度的计算。
“1)”我可以理解,保证发包长度不超过最大发包长度;
2)”我理解是不是对包进行分片,首包的长度是20字节,之后的都是27个字节,这个设计应该是考虑天线效率的问题吧,而且这个分片也只是让数据长度满足20 + x * 27岁的格式吧?
3)”我就非常不理解了,它是根据缓冲区的长度来确定发包长度的,感觉这个完全就把1、2覆盖了。
还有,我记得蓝牙数据包的最大长度是不超过27个字节的,串口程序一下子发了128字节,那协议栈会自动分包吗?是不是相当于把数据放在一个缓冲区了?
谢谢!
首先,最大长度为27是出于这样的考虑。因为蓝牙4.0的包的数据部分的长度最大为31个字节,由头字段的字段决定(5个点)。由于有可能会涉及到加密,需要额外留出4个字节,用于存储麦克风的数据。所以是27个。
而首个数据包是20个字节,是因为需要留出前面7个字节存储以下信息:
> 2字节所有数据包的长度(包含拆包之前的所有数据长度,即20 + 27 * x)
> 2字节通道ID(一般对于写操作来说,为0 x0004)
>1 byte Command (0x52 - Attribute Opcode - Write Command)
> 2字节属性处理(对应你要写的属性处理)
是在协议栈自动分包的