LM3S6911三串口的实现



   请问,我如何实现LM3S 6911 的3个串口同时接受和发送数据?要实现这个功能,需要如何初始化?

我刚写的程序,实现两个,不行,只有uCOS上面的第一个发送后然后就会全部同时发送了,程序如下:

void init_urat(void)
{
#if 1
 SysCtlLDOSet(SYSCTL_LDO_2_75V);
 SysCtlClockSet(SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL  | SYSCTL_OSC_MAIN ); // The crystal is 6MHz
 //Sysclk=SysCtlClockGet();

 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);  //使能RX/TX所在的GPIO端口
 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); //使能UART模块
 GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0 | GPIO_PIN_1);// 配置RX/TX所在管脚为UART收发功能
 UARTConfigSet(UART0_BASE,9600,UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
 //配置UART端口、波特率:9600、 数据位:8、停止位:1、 校验位:无
 UARTEnable(UART0_BASE);  // 使能UART端口
 Sysclk=SysCtlClockGet();
 #endif
}
void init_urat1(void)
{
     SysCtlLDOSet(SYSCTL_LDO_2_75V);
 SysCtlClockSet(SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL  | SYSCTL_OSC_MAIN ); // The crystal is 6MHz
 //Sysclk=SysCtlClockGet();

 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);  //使能RX/TX所在的GPIO端口
 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); //使能UART模块
 GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_2 | GPIO_PIN_3);// 配置RX/TX所在管脚为UART收发功能
 UARTConfigSet(UART1_BASE,9600,UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
 //配置UART端口、波特率:9600、 数据位:8、停止位:1、 校验位:无
 UARTEnable(UART1_BASE);  // 使能UART端口
 Sysclk=SysCtlClockGet();
}
void putstring(const char *x)
{
 while(*x!='\0')
 {
  UARTCharPut(UART0_BASE,*(x++));    //通过UART发送字符串
 }
}
void Uart0TxRxTest(void  *parg)
{
  
  unsigned char  c;
  parg=parg;
  while(1)
   {
           
    //putstring("http://www.cdxy.edu.cn\n");
    //putstring("UTAT0 active\n");
    //SysCtlDelay(Sysclk/3);
    
    c = UARTCharGet(UART0_BASE);  // 等待接收字符
    UARTCharPut(UART0_BASE, c);  // 回显
    //GPIOPinWrite(GPIO_BASE_PORTB,0xf0,c);
    //GPIOPinWrite(GPIO_PORTB_BASE,0xf0,c);
    //SysCtlDelay(Sysclk/10);
    //Counter++;
     //Receive[0]=Counter;
    //Receive[1]=Counter;
     OSTimeDly(1);
   }
}

void Uart1TxRxTest(void  *parg)
{
  
  unsigned char  c;
  parg=parg;
  while(1)
   {
    //putstring("http://www.cdxy.edu.cn\n");
    //putstring("UTAT0 active\n");
    //SysCtlDelay(Sysclk/3);
    c = UARTCharGet(UART1_BASE);  // 等待接收字符
    UARTCharPut(UART1_BASE, c);  // 回显
    //GPIOPinWrite(GPIO_BASE_PORTB,0xf0,c);
    //GPIOPinWrite(GPIO_PORTB_BASE,0xf0,c);
    //SysCtlDelay(Sysclk/10);
    //Counter++;
     //Receive[0]=Counter;
    //Receive[1]=Counter;

    c = UARTCharGet(UART0_BASE);  // 等待接收字符
    UARTCharPut(UART0_BASE, c);  // 回显
    
     OSTimeDly(1);
   }
}

  • 初始化串口没有必要每次都初始化系统时钟。

    SysCtlLDOSet(SYSCTL_LDO_2_75V);
     SysCtlClockSet(SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL  | SYSCTL_OSC_MAIN ); // The crystal is 6MHz
     //Sysclk=SysCtlClockGet();

    这段代码执行一次即可。

    没有明白你说的同时的意思。如果你需要尽可能的同步发送,可以考虑使用DMA进行串口数据收发。