c - 连续发送两个缓冲区

标签 c buffer uart

我有两个字符缓冲区,我正在其中收集数据。

TxBuffer[1400];
TxBuffer2[1400]

我有一种情况是,一个缓冲区将通过uart一次传输,而在另一个缓冲区上我将接收数据,在一个缓冲区传输后,其他缓冲区应该传输。 有什么方法可以做到这一点,而不使用 memset 吗? 我的代码流程如下。

  1. 将从 buff1 中的传感器收集数据
  2. 此时buff2将进行传输
  3. 在 buff2 传输完毕后,buff1 也应该传输
  4. 当 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/

相关文章:

linux - 发生了什么我的 ttyS0 在/proc/interrupt 中没有 irq 列表

c - PIC32 UART 未接收数据

c - 如何在结构中初始化静态数组

在写入缓冲区之前计算 C 字符串的大小

c - 在 fread() 之后访问内存缓冲区

c - C 中的刷新输出缓冲区 (cgi)

c - RN42 蓝牙模块 - 从 C 代码进入命令模式

c - 二进制补码形式的 64 位负整数

c - 如何修复此段错误?

c - Win32 : Forward child message to parent - return value is different