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 – E2E 设计支持 (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版本?