基于RT-Thread调试铱星9602

铱星9602:9线制改3线制

  1. 执行AT&D0,进行忽略DTR引脚,返回OK
  2. 执行AT&K0,进行禁用流控制,改成三线模式,返回OK
  3. 执行AT&W0,进行保存,返回OK.

代码

#include <rtthread.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
#include "board.h"
#include "string.h"

#define KEY0 GET_PIN(H, 9) //电源控制引脚
rt_device_t uart2_dev;
struct rt_semaphore sem;
rt_thread_t uart2_th;

typedef enum{
    FRAME_STEP_START = 0, /*判断表头*/
    FRAME_DATA, /*循环接收数据*/
}frame_step;

struct serial_configure uart2_configs =
    {
        19200,    /* 115200 bits/s */
        DATA_BITS_8,        /* 8 databits */
        STOP_BITS_1,        /* 1 stopbit */
        PARITY_NONE,        /* No parity  */
        BIT_ORDER_LSB,      /* LSB first sent */
        NRZ_NORMAL,         /* Normal mode */
        RT_SERIAL_RB_BUFSZ, /* Buffer size */
        0
    };

rt_err_t rx_callback(rt_device_t dev, rt_size_t size)
{
    rt_sem_release(&sem);
    return RT_EOK;
}
void serial_thread_entry(void *parameter)
{
    char sensor_data = 0;
    frame_step frame = FRAME_STEP_START;
    char buffer[16];
    uint8_t offset = 0;

    while (1)
    {

        /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
        while (rt_device_read(uart2_dev, -1, &sensor_data, 1) != 1)
        {
            /* 阻塞等待接收信号量,等到信号量后再次读取数据 */
            rt_sem_take(&sem, RT_WAITING_FOREVER);
        }

        switch (frame){
            case FRAME_STEP_START:{
                offset = 0;
                if((sensor_data == 0x4F)||(sensor_data == 0x2B)||(sensor_data == 0x45)){
                    buffer[offset++] = sensor_data;
                    frame =FRAME_DATA;
                }
                break;
            }
            case FRAME_DATA:{
                buffer[offset++] = sensor_data;
                if(sensor_data == 0x0a)
                {
                    rt_kprintf("%s\n", buffer);
                    frame = FRAME_STEP_START;
                    rt_memset(buffer, 0, 6);//给数组清零
                }
                break;
            }
        }
    }
}

/*增加写数据命令*/
void rt_write(int argc, char *argv[])
{
    rt_size_t rev;
    char *buffer = argv[1];
    if(strcmp(buffer, "AT") == 0)
    {
        rev = rt_device_write(uart2_dev, 0, "AT\r\n", rt_strlen("AT\r\n"));
    }

    if(strcmp(buffer, "AT+CSQ") == 0)
    {
        rev = rt_device_write(uart2_dev, 0, "AT+CSQ\r\n", rt_strlen("AT+CSQ\r\n"));
    }
    if(strcmp(buffer, "AT+SBDWT") == 0)
    {
        rev = rt_device_write(uart2_dev, 0, "AT+SBDWT\r\n", rt_strlen("AT+SBDWT\r\n"));
    }
    //rev = rt_device_write(uart2_dev, 0, (char *)argv[1], rt_strlen(argv[1]));
    if (rev == RT_NULL)
    {
        rt_kprintf("write data failed!size is %d\n", rev);
        return;
    }
    //rt_kprintf("%s", argv[1]);
}
MSH_CMD_EXPORT(rt_write, rt_write);

int main(void)
{
    rt_size_t rev;
    char *str = "AT\r\n";
    /*拉高电源*/
    rt_pin_mode(KEY0,PIN_MODE_OUTPUT);
    rt_pin_write(KEY0, PIN_HIGH);

    uart2_dev = rt_device_find("uart2");
    if (uart2_dev == RT_NULL)
    {
        rt_kprintf("Can't find device\n");
        return 0;
    }

    if (rt_device_open(uart2_dev, RT_DEVICE_FLAG_RDWR|RT_DEVICE_FLAG_INT_RX) != RT_EOK)
    {
        rt_kprintf("open device failed!\n");
        return 0;
    }
    rt_device_control(uart2_dev, RT_DEVICE_CTRL_CONFIG, &uart2_configs);

    /*给铱星模块写入测试命令*/
    rev = rt_device_write(uart2_dev, 0, str, rt_strlen(str));
    //rt_kprintf("%s", str);
    if (rev == RT_NULL)
    {
        rt_kprintf("write data failed!size is %d\n", rev);
        rt_device_close(uart2_dev);
        return 0;
    }
    rt_kprintf("write data success!  %d\n", rev);

    /*创建线程,接收数据*/
    uart2_th = rt_thread_create("uart2_dev", serial_thread_entry, "uart2", 2048, 10, 5);
    rt_thread_startup(uart2_th);

    /*初始化信号量*/
    rt_sem_init(&sem, "rt_sem", 0, RT_IPC_FLAG_FIFO);

    /*数据接收回调函数*/
    rt_device_set_rx_indicate(uart2_dev, rx_callback);

    return RT_EOK;
}

注:读完一组数之后一定要给数组清零,否则下一次打印会出现错误

与9602连接时,注意收发引脚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值