CC1310 UART Demo代码
CC1310 LaunchPad提供的Demo的UART程序是UART_MODE_BLOCKING模式下的Demo代码,请问能否提供UART_MODE_CALLBACK模式下的Demo代码,谢谢!
自己写的,仅供参考
/*
* ======== uartecho.c ========
*/
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/System.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
/* TI-RTOS Header files */
#include <ti/drivers/PIN.h>
#include <ti/drivers/UART.h>
/* Example/Board Header files */
#include "Board.h"
#include <stdint.h>
#define TASKSTACKSIZE 768
Task_Struct task0Struct;
Char task0Stack[TASKSTACKSIZE];
/* Global memory storage for a PIN_Config table */
static PIN_State ledPinState;
static int flag=0;
/*
* Application LED pin configuration table:
* - All LEDs board LEDs are off.
*/
PIN_Config ledPinTable[] = {
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
/***** Function definitions *****/
void UARTcallback(UART_Handle Handle, void *buf, size_t count){
flag=1;
UART_readCancel (Handle);
//(can not work when here write )UART_write(uart, buf, count);
return;
}
/*
* ======== echoFxn ========
* Task for this function is created statically. See the project's .cfg file.
*/
Void echoFxn(UArg arg0, UArg arg1)
{
char input[10];
UART_Handle uart;
UART_Params uartParams;
const char echoPrompt[] = "\fEchoing characters:\r\n";
/* Create a UART with data processing off. */
UART_Params_init(&uartParams);
uartParams.readMode= UART_MODE_CALLBACK;
uartParams.readCallback=UARTcallback;
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_NEWLINE;//UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 9600;
uart = UART_open(Board_UART0, &uartParams);
if (uart == NULL) {
System_abort("Error opening the UART");
}
UART_write(uart, echoPrompt, sizeof(echoPrompt));
unsigned char rxBuffer[20];
int ret = UART_read(uart, rxBuffer, sizeof(rxBuffer));
UART_write(uart, rxBuffer, sizeof(rxBuffer));
/* Loop forever echoing */
while (1) {
ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1 || rxBuffer!=NULL){
flag=0;
UART_write(uart, rxBuffer, sizeof(rxBuffer));
}
// UART_read(uart, &input, 1);
// UART_write(uart, &input, 1);
}
}
/*
* ======== main ========
*/
int main(void)
{
PIN_Handle ledPinHandle;
Task_Params taskParams;
/* Call board init functions */
Board_initGeneral();
Board_initUART();
/* Construct BIOS objects */
Task_Params_init(&taskParams);
taskParams.stackSize = TASKSTACKSIZE;
taskParams.stack = &task0Stack;
Task_construct(&task0Struct, (Task_FuncPtr)echoFxn, &taskParams, NULL);
/* Open LED pins */
ledPinHandle = PIN_open(&ledPinState, ledPinTable);
if(!ledPinHandle) {
System_abort("Error initializing board LED pins\n");
}
PIN_setOutputValue(ledPinHandle, Board_LED1, 1);
/* This example has logging and many other debug capabilities enabled */
System_printf("This example does not attempt to minimize code or data "
"footprint\n");
System_flush();
System_printf("Starting the UART Echo example\nSystem provider is set to "
"SysMin. Halt the target to view any SysMin contents in "
"ROV.\n");
/* SysMin will only print to the console when you call flush or exit */
System_flush();
/* Start BIOS */
BIOS_start();
return (0);
}
Eggsy,首先感谢你提供的相关代码,能不能解释一下具体的实现流程?
然后是下面这几条语句我也不是很理解
unsigned char rxBuffer[20];
int ret = UART_read(uart, rxBuffer, sizeof(rxBuffer));
UART_write(uart, rxBuffer, sizeof(rxBuffer));
/* Loop forever echoing */
while (1) {
ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1 || rxBuffer!=NULL){
flag=0;
UART_write(uart, rxBuffer, sizeof(rxBuffer));
}
在callback模式下我的理解是相当于单片机的中断,然后需要到相应的中断处理函数中去进行处理,而while(1)前面又是直接read和write,while(1)里面又调用了UART_readPolling,还有if(flag==1 || rxBuffer!=NULL)这句中的flag==1我知道是在回调函数(UARTcallback)里面置1的,而rxBuffer!=NULL为什么要做这样的判断,对此我不是很理解,可能问题比较菜,希望不吝赐教,谢谢!
这是我自己写的,判断是否进入中断了,进入中断flag 就等于1,然后打印出来收到的东西,之所以要UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));是因为要告诉单片机,收到的东西放在哪个数组里面rxBuffer
首先谢谢你的解答,另外我还有几个问题想请教一下你:
1.如上你的回答是不是意思是说UART_readPolling这个函数不是必须的?
2.是不是收到一个字节进入一次UARTcallback?如果我需要对32个字节的数据做处理是不是需要进32次的UARTcallback,然后我是否可以在UARTcallback里处理数据?
Hi Eggsy,
我刚刚将你给的代码烧录到了CC1310的demo板上,发现了如下图所示的情况,在我没有通过串口助手发数据时,一直在while(1)里面打印乱码,请问这是怎么回事?
然后我把while(1)里的判断中的buff != NULL去掉,如下所示
while (1) {
ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1)
{
flag=0;
UART_write(uart, rxBuffer, sizeof(rxBuffer));
}
debug得到的第一次的结果如下图所示,但只能进一次中断回调函数UARTcallback,然后发送就再也进不了UARTcallback了
我这边测试是没问题的呀。你用串口调试助手不断发试试看会出现什么情况
Hi Eggsy,
我刚试过了用串口助手不断发出现的现象跟之前是一样的,然后我又做了如下的尝试:就是将while(1)中的UART_readPolling函数换成UART_read函数,如下图所示:
然后Debug如下图所示,每发一次都能收到数据,但是收到的数据与发送的数据不一致,而且第一次的时候需要发两次才能进回调函数:
最后发送和接收的数据达到对应,但是不一致:
以上,望得到解答,谢谢!
我现在出差,板子不在身边,无法验证一下。
我猜是buffer的长度影响。
代码改为:
while (1) {
ret = UART_read(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1 && rxBuffer!=NULL){
flag=0;
UART_write(uart, rxBuffer, 19);
}
先发19个数据看看,是否正确?
再改为
while (1) {
ret = UART_readPolling(uart, rxBuffer, sizeof(rxBuffer));
if(flag==1 && rxBuffer!=NULL){
flag=0;
UART_write(uart, rxBuffer, 19);
}
再发19个数据看看,是否正确?
Hi Eggsy,
按照你的建议我做了相应的测试,测试结果如下:
1.按照你提供的第一种方式测试结果如下图所示,结果跟之前测试的结果是一样的:
2.按照你提供的第二种方式测试结果如下图所示,测试结果显示收不到发送的数据:
以上,希望得到你的解答,谢谢!
Hi Eggsy,
希望得到你的解答,谢谢!
你手头上还有其他TI 的CC1310的lanchpad吗?可以换一个试一下?
如果没有,先设定发一个字节,数组容量也改小点,试试看。
Hello;
我也遇到了上述的问题,这个最终解决了没?
按照上面的代码运行,中断只能执行一次....
数组容量改小点也不行;
在while(1) 中使用UART_readPolling函数收不到数据?不知道怎么回事?