This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

串口连续发送,只有一次发送成功

Other Parts Discussed in Thread: CC2642R

在使用UART_write(Uart_RxBuf,1)发送数据时,连续使用两个该函数,会只发送成功一个。

UART_write(Uart_RxBuf,1);

UART_write(Uart_RxBuf,1);这样只会受到一次发送。可能是第二次使用该函数时,第一次的缓存数据还没有发送完成,请问该如何解决这个问题。

  • 请问您使用的是哪款芯片/开发板?烧录的是TI例程?
  • 自己做的板子,CC2642r。在读回调中打印一些东西,调试过程中发现,UART_write()隔几行代码不能发送成功。后来发现不能连续使用,我用的TaskUARTWrite里面是UART_write()。下面是一些关键代码。谢谢
    void Uart_Init(uint32_t baudrate)
    {
    // One-time initialization of UART driver
    UART_init();
    // Initialize UART parameters
    UART_Params params;
    UART_Params_init(&params);
    params.baudRate = baudrate;
    params.dataLength = UART_LEN_8; //串口数据位8
    params.stopBits = UART_STOP_ONE; //串口停止位1

    params.readMode = UART_MODE_CALLBACK;
    params.writeMode = UART_MODE_CALLBACK;
    params.readDataMode = UART_DATA_TEXT; //串口接收数据不做处理
    params.writeDataMode = UART_DATA_TEXT; //
    params.readEcho = UART_ECHO_ON; //串口回显
    params.readReturnMode = UART_RETURN_NEWLINE; //当接收到换行符时,回调
    params.readCallback = Uart_ReadCallback; // 串口读回调
    params.writeCallback = Uart_WriteCallback; //
    params.readTimeout = UART_WAIT_FOREVER;
    params.writeTimeout = UART_WAIT_FOREVER;

    uart = UART_open(CONFIG_DISPLAY_UART, &params);
    UART_control(uart, UARTCC26XX_RETURN_PARTIAL_ENABLE, NULL); //允许接收部分回调
    UART_read(uart, Uart_RxTempBuf, 200); //打开一个串口读

    /* Adding basic printf over uart with TI-RTOS
    * Reference : processors.wiki.ti.com/.../CC26xx_Adding_basic_printf_over_uart_with_TI-RTOS */
    // UartPrintf_init(uart);
    }

    void TaskUART_taskFxn(UArg a0, UArg a1)
    {
    Event_Params evParams;
    Event_Params_init(&evParams);
    Event_construct(&uartEvent, &evParams);
    hUartEvent = Event_handle(&uartEvent);

    Uart_Init(115200);
    // UartTask_RegisterPacketReceivedCallback(&UartRxBufCBs);
    while(1)
    {
    UInt events;
    events = Event_pend(hUartEvent,Event_Id_NONE, UARTTASK_EVENT_ALL, BIOS_WAIT_FOREVER);

    if(events & UARTTASK_RX_EVENT)
    {
    // TaskUARTdoWrite(0,0,"ms:\r\n");

    DataDecode(Uart_RxBuf);

    UART_read(uart, Uart_RxTempBuf, 200); //再次打开一个串口读
    }

    if(events & UARTTASK_TX_EVENT)
    {
    TaskUARTWrite(Uart_TxTempBuf, Uart_TxTempLen); //串口打印数据
    }
    }
    }
    //读回调
    void Uart_ReadCallback(UART_Handle handle, void *rxBuf, size_t size)
    {

    memcpy(Uart_RxBuf, rxBuf, size);
    Event_post(hUartEvent, UARTTASK_RX_EVENT);
    // UART_write(uart, Uart_RxBuf, size); //回显打印
    TaskUARTWrite(Uart_RxBuf,size);
    TaskUARTWrite(Uart_RxBuf,2);
    TaskUARTWrite(Uart_RxBuf,3);
    TaskUARTWrite(Uart_RxBuf,4);
    TaskUARTWrite(Uart_RxBuf,5);
    // UART_read(handle, Uart_RxTempBuf, 200); //再次打开一个串口读
    // if ( UartReviceDataCallback)
    // {
    // UartReviceDataCallback(rxBuf, size); //给app任务一个串口读回调
    // UART_write(uart, rxBuf, size); //回显打印
    // }
    }
  • UART驱动程序中没有队列功能。如果在回调模式下按上述方式执行5次写入操作,则最后4个操作很可能会失败(如果您检查返回状态),因为第一个操作尚未完成。

    基本上,在任何给定时间只能进行一次写操作。建议将UART驱动程序设置为“blocking”写入模式。
  • 你好,设置成blocking模式,也是有问题。在初始化使用多个UART_write可以成功,但是在读回调中使用还是只会发送一次,而且好像卡着了,再通过串口助手发送,都没有反应。