This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C123GXL:正在努力通过蓝牙&amp 发送2个字符的命令;UART。 感谢您的帮助。

Guru**** 1839620 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/583356/ek-tm4c123gxl-struggling-to-send-2-character-commands-over-bluetooth-uart-help-appreciated

器件型号:EK-TM4C123GXL

我正在尝试让 TM4C 通过蓝牙与 BLUESMIRF Silver 器件通信。 我想通过蓝牙、然后通过 UART 从我的笔记本电脑向 BLUESMIRF 发送两个字母的简单命令、再从 BLUESMIRF 发送到 TM4C。

笔记本电脑--(蓝牙)-->BLUESMIRF --(UART)-->TM4C

我的连接如下:

TM4C UART PB0 RX <--> BLUESMIRF TX

TM4C UART PB1 TX <--> BLUESMIRF RX

TM4C +3.3V <--> BLUESMIRF Vcc

TM4C GND <--> BLUESMIRF GND

我正在通过连接到 PC 的 micro-USB 为 TM4C 供电。

我正在尝试将命令键入 Tera Term、该术语连接到 COM 端口、该端口是到 BLUESMIRF 的蓝牙连接。 当我连接到正确的 COM 时、它通过点亮 BLUESMIRF 上的绿色 LED 来验证我的蓝牙连接。

如果有人可以检查我的代码并查看是否有问题、我会非常感激。 当我键入 Tera Term 时、我希望它将数据发送到 TM4C 并触发 UART RX 中断、然后根据发送的数据打印特定信息。 谢谢。

--------------------------------------------------

#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include

#ifdef 调试
无效
_error__(char * pcFilename、uint32_t ui32Line)


#endif

char 命令[2]=";
char speed[4]=";

空 UART1处理程序(空)

uint32_t ui32Status;
ui32Status = ROM_UARTIntStatus (UART1_base、true);
ROM_UARTIntClear (UART1_BASE、ui32Status);

UARTgets (command、strlen (command)+ 1);
UARTprintf ("\n");
if (!strcmp (command、"SS"))//设置速度

UARTprintf ("请输入1-100%的所需电机转速。\n");
UARTgets (speed、strlen (speed)+ 1);

否则、如果(!strcmp (命令、"ES"))//紧急停止

UARTprintf ("正在停止电机...");

否则、如果(!strcmp (command、"ST"))//开始

UARTprintf ("正在启动电机...");

UARTprintf ("\n");
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、0);
SysCtlDelay (10000000);

空配置 UART (空)

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART1);
ROM_IntMasterEnable();
ROM_GPIOPinConfigure (GPIO_PB0_U1RX);
ROM_GPIOPinConfigure (GPIO_PB1_U1TX);
ROM_GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
UARTClockSourceSet (UART1_base、UART_CLOCK_PIOSC);
UARTStdioConfig (1、115200、16000000);
IntRegister (INT_UART1、UART1处理程序);
ROM_IntEnable (INT_UART1);
ROM_UARTIntEnable (UART1_base、UART_INT_RX | UART_INT_TX);

/********* 主要内容 /
int main (空)

ROM_FPULazyStackingEnable();
ROM_SysCtlClockSet (
SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN);
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);
ROM_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2);
ConfigureUART();
GPIOPinWrite (GPIO_PORTF_BASE、GPIO_PIN_2、GPIO_PIN_2);
while (1)


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在代码中没有看到任何内容。 您是否通过查看具有示波器的 BLUESMIRF TX 引脚来验证您是否从 BLUESMIRF 器件接收到字符? 还要确保未组装 R29 (就在32KHz 晶振的左侧)。

    一旦接收中断工作、我建议您不要在中断例程内执行所有工作。 通常、您应该快速进入和退出中断。 在这个简单的练习中、您可能根本不使用中断。 使用中断的一种更好的方法是简单地在接收中断例程中读取单个字符并将其放入缓冲区。 检查该字符是否结束了命令,方法是检查接收到的字符数,或检查该字符是否为返回'\r\n'。 如果接收到新命令、请设置一个标志并返回到主循环。 在主循环中、您会不断检查标志、该标志表明您有一个新的命令要处理。 虽然现在似乎没有必要、但如果项目增长并使用其他中断、您会发现您没有足够快地响应其他中断、因为您在 UART1处理程序例程中花费了太多时间。