cc2530-Contiki系统的串口输入问题

在工作中接触到了cc2530,并在上面使用contiki系统。以下是使用串口时遇到的坑。


第一个坑。


首先我尝试在contiki做一个串口回显例程。串口输入可以使用printf函数,可串口输入不是使用scanf函数,我查看源代码了好久,才发现只需要在contiki-conf.h中修改一下配置即可使用串口输入功能。

在contiki-conf.h文件中找到如下代码

/*
 * USARTs:
 *   SmartRF RS232 -> USART0 / Alternative 1 (UART)
 *   SmartRF LCD   -> USART1 / Alternative 2 (SPI)
 */
#define UART_ON_USART     0

#define UART1_CONF_ENABLE 0

#ifndef UART0_CONF_ENABLE
#define UART0_CONF_ENABLE  1
#endif
#ifndef UART0_CONF_WITH_INPUT
#define UART0_CONF_WITH_INPUT 1
#endif

#ifndef UART0_CONF_HIGH_SPEED
#define UART0_CONF_HIGH_SPEED 0
#endif

把UART0_CONF_WITH_INPUT置1即开启了串口输入。




第二个坑。


串口输入功能开启了,现在测试一下串口回显,我输入1234567890给cc2530,返回的却是134690,有时候还是1346790。

很奇怪,数字2、5、8都没有回显。


经过仔细排查,我查到了UART0中断函数那里,代码如下:

  #if UART0_CONF_WITH_INPUT
    #ifdef SDCC
    void
    uart0_rx_isr(void) __interrupt (URX0_VECTOR)
  #else
    #pragma vector=URX0_VECTOR
    __near_func __interrupt void uart0_rx_isr(void)
  #endif
  {
    ENERGEST_ON(ENERGEST_TYPE_IRQ);
    leds_toggle(LEDS_YELLOW);
    URX0IF = 0;
    if(uart0_input_handler != NULL) {
      uart0_input_handler(U0DBUF);
    }
    ENERGEST_OFF(ENERGEST_TYPE_IRQ);
  }
  #endif

宏定义比较难看,我在这里整理一下,最后编译的结果是这样的:

    void
    uart0_rx_isr(void) __interrupt (URX0_VECTOR)
  {
    ENERGEST_ON(ENERGEST_TYPE_IRQ);
    leds_toggle(LEDS_YELLOW);
    URX0IF = 0;
    if(uart0_input_handler != NULL) {
      uart0_input_handler(U0DBUF);
    }
    ENERGEST_OFF(ENERGEST_TYPE_IRQ);
  }

由于之前有使用DHT11读取数据时,第一次读正常第二次读错误的经验(引脚问题),所以这里我很快判断是leds_toggle(LEDS_YELLOW);这条语句影响到了串口回显。注释掉时候,我发送1234567890,回显也显示1234567890了。


以上是使用contiki串口遇到的坑。

你可能感兴趣的:(CC2530,contiki)