我有 telnet 尝试与定制板上的串行端口通信(基于 Tiva TM4C1294XL Enet_S2E 应用程序)。 这基本上是 EK-TM4C1294XL、在端口 c 的引脚5、6、7 (UCA0)上有一个额外的串行端口。 同一电路板设置为将数据从 USB 桥接至同一串行端口。 串行端口需要启用 GPIO 以进行发送(端口 C 引脚5)。 USB 转串行桥接器工作正常。 实际上,当 USB 转串行桥 接器(双向)通信时,我可以在 telnet 端口上看到数据。 为了使 Telent 能够将数据发送到串行端口、我必须驱动 GPIO 引脚。 使用我与串行端口一起使用的 telnet 端的 smae 软件会使许多 telnet 值混乱。
当 telent.c 中的 SerialSend()向 TX FIFO 发送字符时,它不会启动 test_485_EN。 如果我从成功执行相同函数的 serial_task.c 例程中获取代码、则会严重破坏 telnet 代码。 ui32Port 应该为0或1、则会转至较大的伪数。 我想 Assert 语句会禁用此时的所有 IO。 注释掉两条 ROM_GPIOPinWrite 语句会使所有内容恢复正常?? 我可能会对 UCAx 有点高??? 控制寄存器。
serial.c、仅通过 telnet 调用:
===========================================================================================================
void SerialSend (uint32_t ui32端口、uint8_t ui8Char)
{
Assert (ui32Port < MAX_S2E_PORTS); //检查参数。
//
//在确定如何处理 UART 发送中断时禁用此中断
//字符。 否则可能会导致该字符丢失、
//或由于该字符被放置到 UART 中而导致输出停止
//发送缓冲器,但从未传输到 UART FIFO 中。
//
UARTIntDisable (g_ui32UARTBase [ui32Port]、UART_INT_TX);
if (RingBufEmpty (&g_sTxBuf[ui32Port])&&(UARTSpaceAvail (g_ui32UARTBase[ui32Port])))
{
// ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、1); //此处设置485 Talk GAA Nov032017
UARTCharPut (g_ui32UARTBase[ui32Port]、ui8Char); //将该字符直接写入 FIFO。
// ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、0); // CLR 485在此收听 GAA Nov032017
}
否则、如果(!RingBufFull (&g_sTxBuf[ui32Port]) //查看发送缓冲区中是否有空间。
{
RingBufWriteOne (&G) sTxBuf[ui32Port]、ui8Char); //将此字符放入发送缓冲区。
}
UARTIntEnable (g_ui32UARTBase [ui32Port]、UART_INT_TX); //启用 UART 发送中断。
}
===========================================================================================================
SerialTask()可以阻止等待来自串行 ISR 的事件,它成功地使用了以下方法:
=========================================================================================================== 静态空串行任务(void *pvParameters)
{
tSerialEvent sEvent;
while (1) //循环永远。
{
xQueueReceive(g_QueSerial,(void*)&sEvent, portMAX_DELAY ); //阻止一条消息被中断处理程序放入队列中。
if (sEvent.eEventType = RX)
{
if (((g_sParameters.SPORT [sEvent.ui8Port].ui8Flags 和 //如果启用了 Telnet 协议,请检查是否有传入的 IAC 字符,
PORT_FLAG_Protocol)== PORT_PROTOCOL_Telnet)
{
if ((sEvent.ui8Char = Telnet_IAC)&& //如果这是一个 Telnet IAC 字符,请将其写入两次。
(RingBufFree (&g_sRxBuf[sEvent.ui8Port])>=2))
{
RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
}
否则、如果((sEvent.ui8Char!= Telnet_IAC)&& //如果不是 Telnet IAC 字符、则只能写入一次。
(RingBufFree (&g_sRxBuf[sEvent.ui8Port])>=1))
{
RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
}
}
else //如果不是 Telnet,则只写入一次数据。
{
RingBufWriteOne (&G) sRxBuf[sEvent.ui8Port]、sEvent.ui8Char);
}
}
else //检查它是否是 TX 中断
{
while (!RingBufEmpty (&G) sTxBuf[sEvent.ui8Port])&& //在发送 FIFO 中有空间时循环
UARTSpaceAvail (g_ui32UARTBase [sEvent.ui8Port]))
{
ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、1); //将485设置为在此处进行通信
UARTCharPut (g_ui32UARTBase [sEvent.ui8Port]、
RingBufReadOne (&g_sTxBuf[sEvent.ui8Port]); //将下一个字符写入发送 FIFO。
ROM_GPIOPinWrite (GPIO_PORTC_BASE、GPIO_PIN_5、0); // CLR 485侦听此处
}
}
}
}