如何通过串口从Raspberry Pi发送字节到ContikiOS固件

时间:2017-12-15 00:49:27

标签: python raspberry-pi uart contiki texas-instruments

我是ContikiOS的新手,在尝试使用UART界面从我的Raspberry Pi向cc2650启动板发送角色时遇到了问题。

我想让我的Raspberry Pi通过串行接口与cc2650启动板进行通信。我可以完美地从启动板读取串行输出,但是我无法通过串口从RPi向启动板发送内容。

我已经配置了我的Raspberry Pi以在this教程(我正在使用Raspbian Jessie)之后启用UART,并根据Contiki documentation配置运行Contiki的启动板以接收串行消息。

在TeraTerm(适用于Windows的串行监视器)上进行测试时,我可以通过在终端窗口输入并按“CTRL + ENTER”来接收启动板上的字符,它会发送一个“\ n”字符(ASCII = 0x0A) 。启动板按预期工作。

然而,当我尝试使用Python编写的程序在Raspberry Pi上自动化时,似乎启动板没有接收到该字符(或者没有触发selial line事件)。

我得到的是以下行为:

Wrong behavior (on Raspberry Pi)

这就是我的预期:

Expected Behavior (on Windows Machine)

如上图第一张图所示,即使多次发送字符“T”(上方窗口),启动板也不会收到任何内容(底部窗口)通过USB连接启动板时的行为相同(ttyACM0)并通过UART引脚(ttyAMA0)。我不认为问题出在启动板固件上,因为它在与Windows机器连接时效果很好(图2)。所以问题必须在于我的Raspberry Pi配置或我的Python代码。

有人知道我可能做错了吗?

参考源代码: Raspberry Pi:

#Python code running on Raspberry Pi
import serial
import time

uart_port = serial.Serial("/dev/ttyACM0", 115200);

while True:
    uart_port.write("T")
    uart_port.write("\n");
    print("Sent 'T'")
    time.sleep(1)

CC2650 Launchpad:

...
#include "dev/serial-line.h"
...
PROCESS_THREAD(udp_server_process, ev, data)
{      
  char * serial_msg_recv = NULL;

  PROCESS_BEGIN();

  printf("Starting Server Node...\n");
  cc26xx_uart_set_input(serial_line_input_byte);
  SENSORS_ACTIVATE(button_sensor);
...

  while(1) {
    PROCESS_YIELD();
    if(ev == tcpip_event) {
      tcpip_handler();
    }

    if(ev == serial_line_event_message && data != NULL) {
      printf("command received:%s\n",(char *)data);
      serial_msg_recv = (char *)data;
      if(serial_msg_recv[0]=='T'){
        send_toggle();
        printf("_A"); // send ACK
        serial_msg_recv = NULL;
      }
      else{ 
        printf("Invalid command received from serial interface\n");
      }
    }    
  }    
  PROCESS_END();
}

EDIT1:我直接连接了Raspberry Pi的Tx和Rx引脚。 Python脚本正在正确发送字符。这排除了“RPi配置问题”假设,并让我相信,由于某种原因,Contiki在收到'\ n'字符时不会触发事件。

EDIT2:我创建了一个自定义uart回调,以便在收到的每个字符上执行(因此我不会遇到进程事件或\ n和\ r \ n字符的问题)。 Windows上的行为是正常的,但Raspberry Pi上仍然没有运气。即使将bauldrate从115200降低到9600,问题仍然存在。

以下是自定义UART回调:

static int uart_rx_callback(unsigned char c) {
     printf("\nReceived %c",c);
     return 0;
}

新配置:

cc26xx_uart_set_input(uart_rx_callback);

EDIT3:我在Ubuntu虚拟机上测试了Python代码,启动板通过USB连接。启动板能够接收我发送给它的所有字符。看来问题出在Raspberry Pi上。

0 个答案:

没有答案