找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1567|回复: 1
收起左侧

51单片机写了一个正点原子lora模块点对点级联传输代码,打印函数不正常

[复制链接]
ID:1031844 发表于 2022-6-2 20:15 | 显示全部楼层 |阅读模式
我是初学者。想请教一点遇到的问题。用stc12c5a60s2写了一个用正点原子lora模块点对点级联传输的代码。

写的比较简单,调试串口的时候,打印函数一直没有正常工作。
能不能帮我看一下是哪里出了问题。谢谢。

单片机源程序如下:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include "typedef.h"
#include "gpio.h"
#include "intrins.h"
#include"string.h"

unsigned char send_lora_buf[]="AT\r\n";
unsigned char recv_lora_buf[16]={0};        //查询本机lora地址,返回格式是+ADDR:00,00
unsigned char lora_addr[2]={0};  //本机lora地址
unsigned char next_lora_addr[2]={0}; //要发送的lora地址
unsigned char send_data[20]={0};//lora发送给下一个字符串
unsigned char chn[1]={0x00};//信道
unsigned char recv_data[10]={0}; //接收收到的数据
unsigned char flag = 0;
unsigned char temp = 0;

int hex_to_dec(char *a)//十六进制数转十进制数
{
    int len = strlen(a);
    int sum = 0;
        int i;
    for (i = 0;i < len;i++)
    {
        if(a[ i] >= 'A' && a[ i] <= 'F')
        {
            a[ i] = (int) (a[ i] - 'A') + 10 + '0';
        }
        if(a[ i] >= 'a' && a[ i] <= 'f')
        {
            a[ i] = (int) (a[ i] - 'a') + 10 + '0';
        }
        sum += (a[ i] - '0') * (pow(16.0,len - 1 - i));
    }
    return sum;
}

void uartInit(void)        //串口初始化
{
          SCON = 0x50;//   
          AUXR |= 0x40;//
          AUXR &= 0xFE;
    TMOD &= 0x0F; //
        TL1 =0xE8;//        
        TH1 =0xFF; //   
        TR1 = 1; //   
        ET1 = 0; //
    EA = 1;        //允许中断
        ES = 1;        //允许串口中断
        TI = 1;
        // P30 RX P31 TX
}

void delay_ms(int n)                //@11.0592MHz
{
    while(n--)                //将延时一毫秒的程序循环执行n次,通过形参来调节延时的时长
    {
            unsigned char i, j;

            i = 2;
            j = 199;
            do
            {
                    while (--j);
            } while (--i);
    }
}

void uartsenddata(unsigned char c) //串口发送单个字节
{  
    SBUF = c;  
    while(!TI);    //若TI=0,在此等待  
    TI = 0;   
}

void uartsendstring(char *s)  //串口发送字符串
{
        while (*s){                  //检测字符串结束标志
            uartsenddata(*s++);
        }
}


void main(void)
{
    u8 addr_doc = 0;//地址十进制数
          uartInit();        //使能串口115200
        printf("send_lora_buf:%s",send_lora_buf);
        P33 = 1;//MD0拉高,和LORA通讯,接收地址。
        P32 = 0;
        delay_ms(40);
        uartsendstring(send_lora_buf);        //串口发送查询地址命令
        delay_ms(70);
        if(flag ==1)
        {
         strcpy(recv_lora_buf,recv_data);//接收到lora应答
         printf("recv_data:%s",recv_data);
         printf("recv_lora_buf:%s",recv_lora_buf);
        }

        P33 = 0; //关闭lora查询
    delay_ms(40);

        lora_addr[0]= recv_lora_buf[7];        //获取本机地址高位
        lora_addr[1]= recv_lora_buf[9]; //获取本机地址低位

        addr_doc = hex_to_dec(lora_addr); //将十六进制地址转十进制
        addr_doc+=1;
        sprintf(next_lora_addr,"%X",addr_doc); //将地址转为十六进制数

        while(1)
        {
         printf("waiting...");
     //接收到数据
         if(flag ==1)
         {
         flag =0;
         strcat(send_data,next_lora_addr);
         strcat(send_data,chn);
         strcat(send_data,recv_data);//地址信道发送内容拼成数据包
         }
         printf("send_data:%s",send_data);        
        uartsendstring(send_data);
        }

}

void UART_1Interrupt() interrupt 4                //串口中断函数接收程序
{  
        static unsigned char i;        
        if (RI){            
                RI=0;  
                  temp = SBUF;
                recv_data[ i]=temp;//接收到的数据存入数组recv_data中
                i++;
                if(temp==0x0D){
                        i=0;
                        flag=1;//定义接收完成标志位
                }                        
        }
}

原理图.pdf

108.27 KB, 下载次数: 19

回复

使用道具 举报

ID:1011441 发表于 2022-9-9 17:04 | 显示全部楼层
楼主解决问题了吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表