我有两个字符缓冲区,我正在其中收集数据。
TxBuffer[1400];
TxBuffer2[1400]
我有一种情况是,一个缓冲区将通过uart一次传输,而在另一个缓冲区上我将接收数据,在一个缓冲区传输后,其他缓冲区应该传输。 有什么方法可以做到这一点,而不使用 memset 吗? 我的代码流程如下。
- 将从 buff1 中的传感器收集数据
- 此时buff2将进行传输
- 在 buff2 传输完毕后,buff1 也应该传输
- 当 buff1 正在传输时,数据将在 buff2 上收集。
如上所述,我想添加我尝试过的内容,如下所示。 我使用了 2 个字符指针指向一个缓冲区中的特定地址偏移量,如下所示。
unsigned char *block1_ptr = &TxBuffer[Sensor1_Data];
unsigned char *block2_ptr = &TxBuffer[Sensor1_Data +700];
还有一个 1ms,我正在将数据从传感器收集到该缓冲区。如下。
Sensor1_dataptr = Sensor1_GetData();
*block1_ptr = Sensor1_dataptr->datax0;
block1_ptr++;
*block1_ptr = Sensor1_dataptr->datax1;
block1_ptr++;
*block1_ptr = Sensor1_dataptr->datay0;
block1_ptr++;
*block1_ptr = Sensor1_dataptr->datay1;
block1_ptr++;
*block1_ptr = Sensor1_dataptr->dataz0;
block1_ptr++;
*block1_ptr = Sensor1_dataptr->dataz1;
block1_ptr++;
像这样,我也从其他传感器收集数据。收集数据后,我通过 DMA 发送到 uart。 我的问题是,我必须在一个缓冲区中收集数据,而另一个缓冲区正在传输,反之亦然,但如何更改缓冲区,因为 tx 大约每 50 毫秒发生一次,每 1 毫秒收集一次数据。 我的 DMA 配置。如下,
dmaconfig->source = &TxBuffer[Sensor1_Data];
dmaconfig->destination = &UCA0TXBUF;
dmaconfig->size = 1400;
DMAInit(dmaconfig);
DMA_TRIGGER();
我尝试过设置一个标志,当 dma 与 Tx 完成时,该标志将重置。我还保留一个条件如下
if(flag == set)
{
Transmit_buff = &TxBuffer[1400];
}else{
&TxBuffer[1400];
}
我在从传感器收集数据时设置标志。但它不起作用。
最佳答案
您可以使用缓冲区指针,并交换它们而不是复制数据,也许像这样
int main(void) {
char Buff1[180];
char Buff2[180];
char *prxbuf = Buff1;
char *ptxbuf = Buff2;
char *temp;
while (1) {
// receive using prxbuf
// transmit using ptxbuf
// swap the buffer pointers
temp = prxbuf;
prxbuf = ptxbuf;
ptxbuf = temp;
}
return 0;
}
关于c - 连续发送两个缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35636037/