我是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上。