工具与软件:
您好!
我使用 Uart2进行通信。
发送 dl_uart_transmitdatablocking 函数形式的数据时我遇到问题。
有时、来自缓冲区的数据无法在 UART 上完全发送。
来自缓冲区的数据也可以在 UART2_TXDATA 寄存器中看到、并且还可以启用 FIFO。 (UART 波特率9600)
以下是供您参考的代码。 我还附上了缓冲区中要发送的 TX 数据和外部终端(docklight)中接收的数据的屏幕截图。 
空 UartSendSlave (UARTFIFODATA * UART){
UINT16 TxPtr = 0;
datacntptr=0;
执行{
/*if (MAPE_UARTSpaceAvail(UART->BASE){
MAP_UARTCharPutNonBlocking (UART->BASE、UART->BUFF[TxPtr]);
TxPtr++;
其他{
//将任务休眠一段时间
OS_DELAY (1);
*/
/* DL_UART_transmitData (UART->base、UART->buff[TxPtr]);
TxPtr++;*/
// TxPtr=UART->buff[datacntptr];
DL_UART_transmitDataBlocking (UART->base、UART->buff[datacntptr]);
datacntptr++;
} while (datacntptr <uart->txcnt);
}
/
*函数: UartSlaveExecute
*
*参数:UARTFIFODATA * UARTFIFODATA
*
*描述:当从器件处于活动状态时,通过进程循环调用
*
(二 /
空 UartSlaveExecute (UARTFIFODATA * UART)
{
if (UART->mode!= U_SLAVE)
返回;
交换机(UART->STATUS)
{
用例 U_TX:
用例 U_WAIT:
UART->STATUS = U_WAIT;
uart->rxcnt = 0;
//永远等待新的消息
if (OS_semaphore_take ( UART->SemUartRXstart , OS_MAX_DELAY )!= pdTRUE)
{
//OS_DELAY (1);
返回;
}
用例 U_RX:
//循环直到数据包完成(一段时间内没有字符)
//数据包完成、分析
UART->STATUS = U_TX;
uart->protocol_func (UART);
//如果有响应,发送它
if (uart->txcnt)
{
// OS_DELAY (1);
//设置485方向(仅在定义时、用于半双工/双工)
如果(UART->TX_en_port!= 0)
{
if (UART->base ==(unsigned long) MB_SLV_B_INST)
{
TxEnable (UART);
}
设计
{
TxEnable2 (UART);
}
}
//要发送的 FIFO 模式
DL_UART_enableFIFOs (UART->BASE);
//发送数据包并等待传输完成(TX 中断给出的 SEM)
UartSendSlave (UART);
if (OS_semaphore_take (UART->SemUartTXend、30)=pdFALSE)
{
}
while (DL_UART_isBusy (UART->base));
// while (DL_UART_isBusy (UART->base));
//现在可以安全地将收发器置于 RX 模式。 注意:现在在 TX 中断中完成
}
UART->STATUS = U_WAIT;
uart->txcnt = 0;
休息;
问题 U_ERR:
uart->rxcnt = 0;
uart->txcnt = 0;
UART->STATUS = U_WAIT;
OS_DELAY (1);
休息;
}
}