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.

CC2652RB: 请教simple_central、simple_peripheral应用

Expert 1395 points
Part Number: CC2652RB
Other Parts Discussed in Thread: SYSCONFIG, CC2652R, LAUNCHXL-CC26X2R1, , CC2640R2L, CC2640R2F

           请教simple_central、simple_peripheral实现主从通信。现在测试例程simple_peripheral,用Uart输出外接模块实现红外遥控转发;现在的问题是CC2652RB输出的数据怎么被其它模块识别?

1、用Putty可以通信,串口助手不能正常显示

2、修改了代码:static void SimplePeripheral_processCharValueChangeEvt(uint8_t paramId)
{
uint8_t newValue;
switch(paramId)
{
case SIMPLEPROFILE_CHAR1:
SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR1, &newValue);
//Display_printf(dispHandle, SP_ROW_STATUS_1, 0, "Char 1: %d", (uint16_t)newValue);

但是用串口助手依然不能正常显示;红外转发模块Uart的设置为;波特率:115200  停止位:1  数据位:8  奇偶校验:无

现在该如何修改代码才能实现红外转发模块Uart的通信格式呢?

  • 例程中使用的串口格式是VT100控制码,只能在包含VT100的终端上正确显示

    一般串口助手都是ASCII格式,因此不能正常显示

    你需要使用Putty或者Tera Term

  • Kevln Qlu1您好!

                   那若用simple_peripheral实现红外转发终端该怎么实现呢?谢谢!

  • 这个是串口工具编码问题,数据是正确的,只是不能在你的串口工具上正常显示出来

    用我上面说的两个工具都可以正常显示

    那若用simple_peripheral实现红外转发终端该怎么实现呢

    具体指的是什么

  • Kevln Qlu1您好!
           我用其它单片机实现了红外编码生成及驱动,需要做的是CC2652RB通过Uart模式按:“波特率:115200 停止位:1 数据位:8 奇偶校验:无” 的通信格式发送序列,比如:01、02、03然后红外模块的单片机通过Uart接收到相应序列后执行红外数据发送。

  • Kevln Qlu1您好!
    我在simple_peripheral.c文件调用了头文件
    #include <stdint.h>
    #include <stddef.h>
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/UART.h>
    #include "ti_drivers_config.h"
    在函数:static void SimplePeripheral_init(void)添加以下代码:
    char input;
    const char echoPrompt[] = "Echoing characters:\r\n";
    UART_Handle uart;
    UART_Params uartParams;
    /* Call driver init functions */
    GPIO_init();
    UART_init();
    /* Configure the LED pin */
    //GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    /* Create a UART with data processing off. */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.readReturnMode = UART_RETURN_FULL;
    uartParams.baudRate = 115200;
    在函数:static void SimplePeripheral_processCharValueChangeEvt(uint8_t paramId)
    uint8_t dat[3]={0x03,0x06,0x09};
    UART_write(uart,&dat,3);
    结果编译报错,请问该怎么解决呢?

  • 显示uart没有被定义,你在static void SimplePeripheral_init(void)中定义的UART_Handle uart;是局部变量

    只能在该函数中使用

    在static void SimplePeripheral_processCharValueChangeEvt不能被调用

    要将 uart定义为全局变量

  • Kevln Qlu1您好!

             修改后编译通过烧录,当执行到

    case 6:
    Display_printf(dispHandle, 0, 0, "06");
    UART_write(uart,&dat,3);

    调用到UART_write,BTool报错

  • dispHandle和uart 是用兩個不同的UART 嗎?uart 有作UART_Open?

  • YiKai Chen您好!十分感谢您的回复和帮助!
    我按dev.ti.com/.../node
    在simple_peripheral.c文件初始化添加了:
    在SimplePeripheral_init(void)函数里我添加了以下代码:


    现在不管是:uart=UART_open(CONFIG_UART_0, &uartParams);还是uart=UART_open(CONFIG_UART_1, &uartParams);编译都会报错。

  • 你sysconf有把uart設置好嗎?

  • YiKai Chen您好!十分感谢您的回复和帮助

          没有设置sysconf哦,这怎么设置?在那个文件里

  • 參考下圖

  • YiKai Chen您好!十分感谢您的回复和帮助!
                我现在启用了:UART_open后 PuTTY没有信息打印了,不执行UART_open就有打印输出,我在CC2562RB的DIO0、和DIO1连接了TTL转USB模块,另外开了一个串口助手,当复位CC2562RB时串口助手(UART2)只显示了HEX的00.

  • 請你把你的操作步驟解釋清楚一下,不然不知道是怎麼回事

  • YiKai Chen您好!十分感谢您的回复和帮助!
               是这样;源代码用的Uart的IO是DIO2、DIO3我用这个端口连接的PuTTY,在没启用Uart2也就是不执行UART_open这一句,代码烧录后复位板子会打印相关信息,通过btool 连接终端时能看到信息;现在启用Uart2后,原来Uart没有数据输出了。屏蔽UART_open后原Uart就有打印输出。我现在用原Uart输出到PuTTY、Uart2输出到另一个串口工具,在复位时Uart无输出、Uart2只打印了16进制的0x00

  • 我指的是你要說明清楚你是怎樣使用Uart2,這樣模糊的描述我猜不出你的問題在那

  • YiKai Chen您好!十分感谢您的回复和帮助!

           我是想用例程simple_centralsimple_peripheral实现一主多从模式,现在用simple_peripheral实现红外遥控转发器终端,我用其它单片机实现了红外编码生成及Uart通信,现在需要CC2562RB通过Uart按照通信格式:“波特率:115200 停止位:1 数据位:8 奇偶校验:无来发送数据给红其它单片机;在SimplePeripheral_processCharValueChangeEvt函数里实现Uart2的Uart数据转发

    static void SimplePeripheral_processCharValueChangeEvt(uint8_t paramId)

    {

      uint8_t newValue;

      uint8_t dat[3]={0x03,0x06,0x09};

      switch(paramId)

      {

        case SIMPLEPROFILE_CHAR1:

          SimpleProfile_GetParameter(SIMPLEPROFILE_CHAR1, &newValue);

          Display_printf(dispHandle, SP_ROW_STATUS_1, 0, "Char 1: %d", (uint16_t)newValue);

          switch(newValue)

                {

                case 1:

                    Display_printf(dispHandle, 0, 0, "01");

                    newValue=0;

                break;

                case 6:

                    Display_printf(dispHandle, 0, 0, "06");

                    UART_write(uart2,dat,3);

                    newValue=0;

                    break;

             default:;

          }

     不知道这样描述您能看清了么?之前有个帖子,(+) CC2652RB: 请教simple_peripheral应用 - 蓝牙论坛 - Bluetooth - E2ETm 设计支持 (ti.com)当时用CC2562RB实现红外编码不理想,后来我用其它单片机实现了红外编码生成。

  • 只看到你調用了UART_write(uart2,dat,3),照理說你要用第二組uart應該是要用UART2_Params_init/UART2_open/UART2_write,你先參考一下uart2 例程

  • YiKai Chen您好!十分感谢您的回复和帮助!
    我在simple_peripheral.c代码开始处添加了以下内容:
    #include <stdint.h>
    #include <stddef.h>
    #include <semaphore.h>
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/UART2.h>
    #include "ti_drivers_config.h"
    char input;
    const char echoPrompt[] = "Echoing characters:\r\n";
    UART2_Handle uart;
    UART2_Params uartParams;
    int32_t semStatus;
    uint32_t status = UART2_STATUS_SUCCESS;
    static sem_t sem;
    static volatile size_t numBytesRead;

    static void SimplePeripheral_init(void)函数里添加了:
    GPIO_init();
    UART2_Params_init(&uartParams);
    uartParams.readMode = UART2_Mode_CALLBACK;
    uartParams.readCallback = callbackFxn;
    uartParams.baudRate = 115200;
    uart = UART2_open(CONFIG_UART2_0, &uartParams);
    当添加:void callbackFxn(UART2_Handle handle, void *buffer, size_t count,
    void *userArg, int_fast16_t status)函数后编译报错

  • 加上 #include <semaphore.h>試試

  • YiKai Chen您好!十分感谢您的回复和帮助!

         添加了头文件#include <semaphore.h>还是会报错

  • 你程序哪用到sem_init/sem_post?

  • YiKai Chen您好!十分感谢您的回复和帮助!
    在官方帮助文档:uart2callback.c
    void *mainThread(void *arg0)
    {
    char input;
    const char echoPrompt[] = "Echoing characters:\r\n";
    UART2_Handle uart;
    UART2_Params uartParams;
    int32_t semStatus;
    uint32_t status = UART2_STATUS_SUCCESS;
    /* Call driver init functions */
    GPIO_init();
    /* Configure the LED pin */
    GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    /* Create semaphore */
    semStatus = sem_init(&sem, 0, 0);
    if (semStatus != 0) {
    /* Error creating semaphore */
    while (1);
    }
    /* Create a UART in CALLBACK read mode */
    UART2_Params_init(&uartParams);
    uartParams.readMode = UART2_Mode_CALLBACK;
    uartParams.readCallback = callbackFxn;
    uartParams.baudRate = 115200;
    uart = UART2_open(CONFIG_UART2_0, &uartParams);
    if (uart == NULL) {
    /* UART2_open() failed */
    while (1);
    }

    初始化部分用到的,
    void callbackFxn(UART2_Handle handle, void *buffer, size_t count,
    void *userArg, int_fast16_t status)
    {
    if (status != UART2_STATUS_SUCCESS) {
    /* RX error occured in UART2_read() */
    while (1);
    }
    numBytesRead = count;
    sem_post(&sem);
    }
    我后来把uartParams.readCallback = callbackFxn;屏蔽了,编译可以通过但是串口2没数据输出。截图如下:

  • uart的handle是對的嗎?

  • YiKai Chen您好!十分感谢您的回复和帮助!

             应该是对的,按照官方的复制过来的;

  • 我指的是檢查一下UART2_open回來後uart 是不是null

  • YiKai Chen您好!十分感谢您的回复和帮助!

            刚才测试了下,串口打开失败:

    LED常亮,代码卡在那里了。

  • 你CONFIG_UART2_0的定義是什麼?

  • YiKai Chen您好!十分感谢您的回复和帮助!

    定义如下:

  • 把你程序裡面的UART_init拿掉試試

  • YiKai Chen您好!十分感谢您的回复和帮助!

               刚刚屏蔽UART_init();测试了下,还是卡在打开串口2的位置。

  • 你UAER2相關的程序是放在simple_peripheral的哪裡?

  • YiKai Chen您好!十分感谢您的回复和帮助!

             串口2初始化代码放在了static void SimplePeripheral_init(void)里,如下图:

  • 我在sysconfig上使能UART2然後在SimplePeripheral_init最後加上下列的程序是可以正常運作的啊

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /* Create a UART in CALLBACK read mode */
    UART2_Params_init(&uartParams);
    //uartParams.readMode = UART2_Mode_CALLBACK;
    //uartParams.readCallback = callbackFxn;
    uartParams.baudRate = 115200;
    uart = UART2_open(CONFIG_UART2_0, &uartParams);
    if (uart == NULL) {
    /* UART2_open() failed */
    while (1);
    }
    /* Pass NULL for bytesWritten since it's not used in this example */
    UART2_write(uart, echoPrompt, sizeof(echoPrompt), NULL);
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • YiKai Chen您好!十分感谢您的回复和帮助!

            按您的结构可以通信了,跟您的代码对比,屏蔽这一句uartParams.readMode = UART2_Mode_CALLBACK;现在串口2有输出了,若不屏蔽还是会卡在初始化部分;接下来我想实现和simple_central例程通信;我等会把代码烧录了先看看相关文档有疑难再来请教!谢谢!

  • 我這邊加上UART2_Mode_CALLBACK跑起來也沒什麼問題

  • YiKai Chen您好!十分感谢您的回复和帮助!

            那我估计我的代码还有问题,我试了几次,只要加Params.readMode = UART2_Mode_CALLBACK;代码就无法完成初始化,LED会常亮;我现在把simple_central的代码烧录到芯片了,如何和SimplePeripheral实现类似zigbee协调器和终端那种模式的通信呢?看官方说明都是用putty监视,通过按键来实现通信,感觉不太适用。

  • BLE互通就是simple_central/SimplePeripheral透過GATT characteristics來溝通,你的應用應該就是simple_central去寫入SimplePeripheral的红外遥控转发 GATT characteristics

  • YiKai Chen您好!十分感谢您的回复和帮助!

              您能否给出一些步骤该怎么来实现呢?或者给一些参考资料,我参考资料再加上您的指导;否则估计要烦扰您很多,我对BLE基本没接触过。

  • BLE的部份就是參考SimpleLink Academy的 dev.ti.com/.../node

  • YiKai Chen您好!十分感谢您的回复和帮助!

             好的,我先看看尝试实现下;我也感觉我目前的实现方法不太灵活,正常的应该是SimplePeripheral接收到simple_central的数据直接转发给红外模块,而不是我目前这种人为设定的固定格式的数据是吧

  • 這部份端看你應用程序怎樣安排,我認為都是可以的

  • YiKai Chen您好!十分感谢您的回复和帮助!

              哦,好的;那先按目前的去实现吧;现在有个问题请教,就是simple_central是否可以通过串口开实现扫描终端,添加终端设备呢?目前这个按键模式的感觉太繁琐,若要实现该在那个函数去添加修改呢?

  • simple_centralc通过串口开实现扫描终端以及添加终端设备這不就是Btool+HostTest嗎?

  • YiKai Chen您好!十分感谢您的回复和帮助!
                 那我若用HostTest例程作为网关,透过串口和云端及手机通信;和SimplePeripheral终端BLE组网这样可以吗?HostTest可以连接的终端数和simple_central是一样的吧?

  • 1. 可以

    2. 是的

  • YiKai Chen您好!十分感谢您的回复和帮助!

               好的,谢谢!我先尝试去实现下看。

  • YiKai Chen您好!十分感谢您的回复和帮助!

                HostTest例程编译报错,试了两款板子的代码都一样报错,是我的环境有问题么?

  • 你要不要先描述一下你的环境?CCS和SDK版本?

1 2
x 出现错误。请重试或与管理员联系。