4个职位/ 0个新
最后发表
z20121202038
离线
最后看到:4年2周以前
加入:2016-03-30 51
关于需求方中串口的中断收包机制

你好,
1)需求方中串口是不是只要收到包,就会触发中断,还是必须收包超过一定量或者时间到了才会触发中断?
2)串口中断处理函数期间,串口会丢包吗?还是会继续收报,也就是中断处理函数的执行时间不影响串口收包,收包只和寄存器的数量相关?
3)如果串口寄存器全满,又没有操作来读包,串口是不是就是开始丢包了?
谢谢

设备:
Gongyu_Dialog
离线
最后看到:6天8小时前
加入:2016-04-27 07:07
1 .注意到TX_WAIT_LEVEL和TX_WAIT

1 .注意到TX_WAIT_LEVEL和TX_WAIT_ROUND这两个参数,用于决定什么时候开启BLE的数据传输
2. uart会继续收包,这是硬件直接完成的工作,只不过此时中断被屏蔽,不会触发新的中断。
3.是这样的,老的数据就会被覆盖

z20121202038
离线
最后看到:4年2周以前
加入:2016-03-30 51
好的,非常感谢。

好的,非常感谢。
还有个疑问,我看蓝牙发包那块,一次性最多可以发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字节,那协议栈会自动分包吗?是不是相当于把数据放在一个缓冲区了?
谢谢!

Gongyu_Dialog
离线
最后看到:6天8小时前
加入:2016-04-27 07:07
首先,最大长度为27是出于这样的考虑。因为蓝牙4

首先,最大长度为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字节属性处理(对应你要写的属性处理)

是在协议栈自动分包的