rt-thread应用笔记--基于阿波罗的网络应用


配置网络:

Hardware Drivers Config  --->
   Onboard Peripheral Drivers  --->
        [*] Enable Ethernet 

配置pcf8574: 开发版使用了pcf8574做为PHY芯片的复位引脚

RT-Thread online packages  --->
peripheral libraries and drivers  --->
        -*- pcf8574: Remote 8-bit I/O expander for I2C-bus  --->

配置静态IP地址:(也可以稍后在程序中配置)

RT-Thread Components  --->
    Network  --->
        -*- LwIP: light weight TCP/IP stack  --->
            Static IPv4 Address  --->

先执行pkgs --update下载pcf8574,否则编译时会提示缺少文件。
再执行scons --target=mdk5, 重新生成工程


- 阅读全文 -

QT5开发笔记--运行参数选项


头文件:

#include <QCommandLineOption>
#include <QCommandLineParser>
/// 先设置选项
QCommandLineOption op1("g");
op1.setValueName("Grop");        
op1.setDefaultValue("0.0.0.0");

QCommandLineOption op2("p");
op2.setValueName("Port");
op2.setDefaultValue("7788");

QCommandLineOption op3("h");
op3.setValueName("Local");
op3.setDefaultValue("0.0.0.0");

QCommandLineOption op4("n");
op4.setValueName("PreName");    /// 不指定名称,则不可以跟参数,只能做为选项
op4.setDefaultValue("RT");

QCommandLineOption op5("f");
op5.setValueName("Path");
op5.setDefaultValue(qApp->applicationDirPath());

QCommandLineParser parser;
parser.addOption(op1);
parser.addOption(op2);
parser.addOption(op3);
parser.addOption(op4);
parser.addOption(op5);
parser.addOption(op6);
parser.process(a);          /// QCoreApplication的a

local_port = parser.value(op2).toUInt();    /// 整型
local_addr = parser.value(op3);             /// 字符串型
PreName    = parser.value(op4);  
/// 判断是否指定了该参数
if(parser.isSet(op1))
{
    
}

/// 也可通过参数名获取
log_path = parser.value("f");

运行示例: 可以空格或者直接跟随,也可以用--和=指定

MultiLogs.exe -g 224.8.8.8 -p7788 -h192.168.10.155 -n RT --f=D:\logs

多个相同参数列表:

/// 参数声明
QCommandLineOption op8("t");
op8.setValueName("host");    
  
/// 参数解析  
QStringList target = parser.values(op8);
foreach(QString ipaddr, target)
{
    qDebug() << ipaddr;
}
MultiLogs.exe -t192.168.10.155 -t192.168.10.166 -t192.168.10.177

- 阅读全文 -

menuconfig语法说明


menu/endmenu 条目 用于生成菜单,不可修改,只能进入子菜单

  menu 用于生成菜单, endmenu 就是菜单结束标志,这两个一般是成对出现的

menuconfig 带选项的菜单, 和 menu类似,但是具有config的功能;

config 配置项,会根据后边的字符生成 CONFIG_xxx的宏

        config BSP_SPI5_RX_USING_DMA
            bool "Enable SPI5 RX DMA"
            depends on BSP_USING_SPI5
            select BSP_SPI5_TX_USING_DMA
            default n  

bool - 表示该配置项为bool类型,后边的字符为提示符(int)
default - 表示默认选项
range - 表示输入一个范围,后边跟上下限,主要用于int型变量


select - 当前选中项被选中时,该项目自动被选中(生成对应的CONFIG_xxx宏)


comment 用于显示注释(会在配置菜单中显示出来)

- 阅读全文 -

rt-thread应用笔记--串口


文章摘要: 本文描述了基于rt_thread的串口通信应用示列

硬件平台: 正点原子阿波罗stm32f429开发版

定义数据结构及声明全局变量:

struct serial_msg
{
    rt_device_t dev;
    rt_size_t size;
    char buf[8];
};

static struct rt_messagequeue mq;
static rt_device_t serial;

查找并打开串口设备:

serial = rt_device_find(port_name);
if (!serial)
{
    rt_kprintf("find %s failed!\n", port_name);
    return RT_ERROR;
}

/// 读写模式,中断读取        
ret = rt_device_open(serial,RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);

发送数据:

rt_device_write(serial, 0, "HelloWorld\r\n", 12);

接收数据:

static void serial_recv_task(void *args)
{    
    rt_mq_init(&mq, 
                "serial_mq",
                msg_pool,                     // 存放消息的缓冲区 
                sizeof(struct serial_msg),    // 一条消息的最大长度
                sizeof(msg_pool),             // 存放消息的缓冲区大小
                RT_IPC_FLAG_FIFO);            // 先来先得到的方法分配消息
    
    rt_device_set_rx_indicate(serial, uart_input); /// 设置接收回调函数 

    while (1)
    {    
        /// 从消息队列中读取消息
        ret = rt_mq_recv(&mq, &msg, sizeof(msg), RT_WAITING_FOREVER); 
        if (ret == RT_EOK)
        {  
            for(i = 0; i < msg.size;i++)
            {
                rt_kprintf("%c",msg.buf[i]);
            }
        }
    }
}

中断回调函数:

static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
    struct serial_msg msg;
    rt_err_t result;    
    msg.dev = dev;    
    while(size > 0)
    {
        if(size > 8)
        {
            msg.size = rt_device_read(msg.dev, 0, msg.buf, 8); 
            size -= 8;
        }
        else
        {
            msg.size = rt_device_read(msg.dev, 0, msg.buf, size); 
            size = 0;
        }
        result = rt_mq_send(&mq, &msg, sizeof(msg));  /// 发送至消息队列
        if (result == -RT_EFULL)
        {        
            ///rt_kprintf("message queue full!\n");     ///消息队列满
        }
    }
}

- 阅读全文 -


Copyright©2024 春天花会开, All Rights Reserved. Email: webmaster@oroct.com