连续发送两个缓冲区
Transmitte Two buffers Consequtively
我有两个字符缓冲区,我正在其上收集数据。
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];
}
我在从 sensors.But 收集数据时设置标志,但它不起作用。
您可以使用缓冲区指针,交换它们而不是复制数据,也许像这样
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;
}
我有两个字符缓冲区,我正在其上收集数据。
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];
}
我在从 sensors.But 收集数据时设置标志,但它不起作用。
您可以使用缓冲区指针,交换它们而不是复制数据,也许像这样
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;
}