TI中文支持网
TI专业的中文技术问题搜集分享网站

CC2652RB: 请教simple_central、simple_peripheral应用

Part Number:CC2652RBOther 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的通信格式呢?

Kevin Qiu1:

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

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

你需要使用Putty或者Tera Term

,

WSP:

Kevln Qlu1您好!

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

,

Kevin Qiu1:

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

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

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

具体指的是什么

,

WSP:

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

,

Kevin Qiu1:

使用串口发送数据参考uart例程:https://dev.ti.com/tirex/explore/node?node=ANhQofB3MjwqjieTKAwX2A__pTTHBmu__LATEST

,

WSP:

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);结果编译报错,请问该怎么解决呢?

,

Kevin Qiu1:

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

只能在该函数中使用

在static void SimplePeripheral_processCharValueChangeEvt不能被调用

要将 uart定义为全局变量

,

WSP:

Kevln Qlu1您好!

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

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

调用到UART_write,BTool报错

,

YiKai Chen:

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

,

WSP:

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);编译都会报错。

,

YiKai Chen:

你sysconf有把uart設置好嗎?

,

WSP:

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

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

,

YiKai Chen:

參考下圖

,

WSP:

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

,

YiKai Chen:

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

,

WSP:

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

,

YiKai Chen:

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

,

WSP:

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

       我是想用例程simple_central和simple_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实现红外编码不理想,后来我用其它单片机实现了红外编码生成。

,

YiKai Chen:

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

,

WSP:

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)函数后编译报错

,

YiKai Chen:

加上 #include <semaphore.h>試試

,

WSP:

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

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

,

YiKai Chen:

你程序哪用到sem_init/sem_post?

,

WSP:

YiKai Chen您好!十分感谢您的回复和帮助!在官方帮助文档:uart2callback.cvoid *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没数据输出。截图如下:

,

YiKai Chen:

uart的handle是對的嗎?

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

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

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

,

YiKai Chen:

你CONFIG_UART2_0的定義是什麼?

,

WSP:

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

定义如下:

,

YiKai Chen:

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

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

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

,

YiKai Chen:

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

/* 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);

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

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

,

YiKai Chen:

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

,

WSP:

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

,

YiKai Chen:

1. 可以

2. 是的

,

WSP:

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

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

,

WSP:

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

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

,

YiKai Chen:

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

赞(0)
未经允许不得转载:TI中文支持网 » CC2652RB: 请教simple_central、simple_peripheral应用
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1