打印

求助,串口输入数据后用nRF24L01进行无线传输

[复制链接]
2868|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
toniz26|  楼主 | 2013-6-13 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个主程序是将要发送的数据直接写进程序中,然后通过nRF24L01进行无线传输,现在需要改成通过串口输入一个数据之后在进行无线传输,该怎么改?求教各位大神!我是新手~~
#include "stm32f4xx.h"
#include "usart.h"
#include "NRF24L01/NRF24L01.h"
#include "stm32f4xx_usart.h"

#define Open_TX        1                        //发送

//#define Open_RX        0                        //接收

extern unsigned char RX_BUF[];
extern unsigned char TX_BUF[];

void  Delay (uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}

int main(void)
{
        USART_Configuration();

        nRF24L01_Initial();
        printf("\r\nUSART1测试成功!NRF2401初始化成功!\r\n");
        while(1)
        {
                #ifdef Open_TX
               
                        TX_BUF[0]= oxaa;
                        NRF24L01_Send();
                        printf("\r\nSend data:0x%x\r\n",TX_BUF[0]);
                       
                        Delay(0xffffff);
                #else
                        NRF24L01_Receive();
                #endif
        }

}
沙发
toniz26|  楼主 | 2013-6-13 11:39 | 只看该作者
我用的是STM32F407的芯片

使用特权

评论回复
板凳
杨爱林林| | 2013-6-13 11:42 | 只看该作者
#ifdef Open_TX
                if(串口接收到数据)
                        {
                       TX_BUF= 数据;
                        NRF24L01_Send();
                         }
printf("\r\nSend data:0x%x\r\n",TX_BUF[0]);
                        
                        Delay(0xffffff);
                #else
                        NRF24L01_Receive();
                #endif

使用特权

评论回复
地板
toniz26|  楼主 | 2013-6-13 11:55 | 只看该作者
杨爱林林 发表于 2013-6-13 11:42
#ifdef Open_TX
                if(串口接收到数据)
                        {

是用USART_Receivedata(USART1)这个函数吗?我是纯新手,一点基础没有!
那个串口接收到数据和数据该怎么写?如果是USART1。
变量定义有没有问题啊?卸载程序里的都是16进制数,如果想输入的是字符串该怎么定义啊?
多谢大神~

使用特权

评论回复
5
杨爱林林| | 2013-6-13 12:00 | 只看该作者
嗯 你看看stm32 库函数串口这一块  
先把串口调试好 把接收到的数据保存起来
然后在 main里面 就像我讲的那样处理

使用特权

评论回复
6
toniz26|  楼主 | 2013-6-13 12:08 | 只看该作者
杨爱林林 发表于 2013-6-13 12:00
嗯 你看看stm32 库函数串口这一块  
先把串口调试好 把接收到的数据保存起来
然后在 main里面 就像我讲的 ...

直接这么改行不行?
int main(void)
{
        USART_Configuration();

        nRF24L01_Initial();
        printf("\r\nUSART1测试成功!NRF2401初始化成功!\r\n");
        while(1)
        {
                #ifdef Open_TX
               
                        TX_BUF[0]= (u8)USART_ReceiveData(USART1);
                        NRF24L01_Send();
                        printf("\r\nSend data:0x%x\r\n",TX_BUF[0]);
                       
                        Delay(0xffffff);
                #else
                        NRF24L01_Receive();
                #endif
        }

}

使用特权

评论回复
7
toniz26|  楼主 | 2013-6-13 12:21 | 只看该作者
杨爱林林 发表于 2013-6-13 12:00
嗯 你看看stm32 库函数串口这一块  
先把串口调试好 把接收到的数据保存起来
然后在 main里面 就像我讲的 ...

我刚下载试了一下
发送之前是
Send data:0x0
发送123之后是
Send data:0x31

使用特权

评论回复
8
杨爱林林| | 2013-6-13 12:23 | 只看该作者
直接改 也行啊
但是你那样写的话  每次只能传输一个字节
所以你发送123  也就等于发送了  1    即0x31

使用特权

评论回复
9
mmuuss586| | 2013-6-13 12:31 | 只看该作者
没用过哎。

使用特权

评论回复
10
toniz26|  楼主 | 2013-6-13 12:35 | 只看该作者
杨爱林林 发表于 2013-6-13 12:23
直接改 也行啊
但是你那样写的话  每次只能传输一个字节
所以你发送123  也就等于发送了  1    即0x31 ...

想发送几就显示几,而不是十六进制的数该怎么改?啊

使用特权

评论回复
11
toniz26|  楼主 | 2013-6-13 13:42 | 只看该作者
杨爱林林 发表于 2013-6-13 12:23
直接改 也行啊
但是你那样写的话  每次只能传输一个字节
所以你发送123  也就等于发送了  1    即0x31 ...

是不是定义tx_buf[]数组的问题啊?导致只能传16进制数而不能传其他的数字或者字母?

使用特权

评论回复
12
toniz26|  楼主 | 2013-6-13 15:23 | 只看该作者
各位大神啊,求教啊 ~~·

使用特权

评论回复
13
杨爱林林| | 2013-6-13 16:10 | 只看该作者
串口接收函数 一次性把 所有的字符 都存到缓冲区啊   
你直接TX_BUF[0]= (u8)USART_ReceiveData(USART1);这样的话  
每次只能接收一个字符啊
跟16进制没关系  
可明白我的意思啦

使用特权

评论回复
14
杨爱林林| | 2013-6-13 16:34 | 只看该作者
就像我说的
写个串口接收函数(多字节接收)  定义个接收buf  
先将数据保存起来  
TX_BUF[0]= (u8)USART_ReceiveData(USART1);
仅仅用这句 想实现将串口接收的数据无线发送  是不行的
因为 TX_BUF[0]= (u8)USART_ReceiveData(USART1);
它每次只处理串口数据寄存器里面的值  也就是每次只能处理 一个字节  并将它放在TX_BUF而已  仅仅只有
TX_BUF【0】 改变  所以 你发送123给板子  最终只能通过无线发送1  (0x31)
可明白我的意思啦  
先写个接收函数  定义 接收buf
然后将buf里面的值 拷贝到TX_BUF
然后NRF24L01_Send();
然后就ok了

使用特权

评论回复
15
cjhk| | 2013-6-13 22:03 | 只看该作者
这一块不是很了解   楼主  帮你顶一个吧   你再看看别人的意见   可以吗

使用特权

评论回复
16
toniz26|  楼主 | 2013-6-14 09:57 | 只看该作者
杨爱林林 发表于 2013-6-13 16:34
就像我说的
写个串口接收函数(多字节接收)  定义个接收buf  
先将数据保存起来  

完全明白你的意思,无奈刚接触,能力有限啊~~具体不会编啊,大神能不能给点思路~~

使用特权

评论回复
17
toniz26|  楼主 | 2013-6-14 11:19 | 只看该作者
杨爱林林 发表于 2013-6-13 16:34
就像我说的
写个串口接收函数(多字节接收)  定义个接收buf  
先将数据保存起来  

我瞎写了一个,不过通不过编译,大神你帮我看看!
#include "stm32f4xx.h"
#include "usart.h"
#include "NRF24L01/NRF24L01.h"
#include "stm32f4xx_usart.h"

#define Open_TX        1                        //发送

//#define Open_RX        0                        //接收

extern unsigned char RX_BUF[];
extern unsigned char TX_BUF[];
extern unsigned char X1_BUF[];


void  Delay (uint32_t nCount)
{
  for(; nCount != 0; nCount--);
}
int i=0;
void USART1_RX(void)
{                                          
   
         for(i=0;i<8;i++)
    {
      X1_BUF = USART_ReceiveData(USART1);
    }
   
}
int main(void)
{       
        USART_Configuration();

        USART1_RX();

        nRF24L01_Initial();
        printf("\r\nUSART1测试成功!NRF2401初始化成功!\r\n");
        while(1)
        {
                #ifdef Open_TX
                       
                        TX_BUF[0]=X1_BUF;
                        NRF24L01_Send();
                        printf("\r\nSend data:0x%x\r\n",TX_BUF[0]);
                       
                        Delay(0xffffff);
                #else
                        NRF24L01_Receive();
                #endif
        }

}





错误是.\Output\Project.axf: Error: L6218E: Undefined symbol X1_BUF (referred from main.o).

使用特权

评论回复
18
杨爱林林| | 2013-6-14 11:58 | 只看该作者
你得加强加强c语言哦
我这是中断接收程序
unsigned char date;
  if((USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)&&(rx1_index < rx2_buffer_shadow_SIZE)) //产生接收中断
    {   
  USART_ClearITPendingBit(USART2, USART_IT_RXNE);        //清除中断标志
  date  = USART_ReceiveData(USART2);
  rx2_buffer_shadow[i]= date;
   ++i;  
  }

你这程序
void USART1_RX(void)
{                                          
      for(i=0;i<8;i++)
    {
      X1_BUF[i] = USART_ReceiveData(USART1);
    }
}


TX_BUF[0]=X1_BUF;改为
memcpy(TX_BUF,X1_BUF,i);
其它的你自己看看吧

使用特权

评论回复
19
杨爱林林| | 2013-6-14 11:59 | 只看该作者
void USART2_IRQHandler(void)
{  
  unsigned char date;
  if((USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)&&(rx1_index < rx2_buffer_shadow_SIZE)) //产生接收中断
    {   
  USART_ClearITPendingBit(USART2, USART_IT_RXNE);        //清除中断标志
  date  = USART_ReceiveData(USART2);
  rx2_buffer_shadow[rx2_index]= date;     
  ++rx2_index;  
    }
  }

使用特权

评论回复
20
toniz26|  楼主 | 2013-6-14 13:21 | 只看该作者
杨爱林林 发表于 2013-6-14 11:59
void USART2_IRQHandler(void)
{  
  unsigned char date;

多谢了,我再好好研究下~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

14

帖子

0

粉丝