yangjiaxu 发表于 2024-10-13 12:27

【匠芯创D133CBS】485的应用

<div class='showpostmsg'> 本帖最后由 yangjiaxu 于 2024-10-13 12:31 编辑

<div>今天与大家来分享【匠芯创D133CBS】的485通讯的应用,因为我想设计一个HMI显示屏功能,现在市面上的HMI显示屏一般是通过网口或者是串口进行通讯的,但是如果实际应用方面HMI显示屏的应用数量比较多,其实是可以通过485实现通信的,这样不仅可以方便现场施工布线,也可以降低应用架构的成本。</div>

<div>本次通过D133CBS开发板背面的电路布局设计来看,是有485通信电路的,并且根据电路原理图得知,该电路采用的是自适应2线485通讯,因此我们可以通过外接485实现与D133CBS开发板进行数据交互。</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图1 D13x7寸开发板(D133CBS)的背面,485电路部分</div>

<div>接下来就是编写程序了,根据官方提供的demo可以看出,如何应用和调用串口通讯,这里将官方的串口例程修改为uart1路径,之后在里面加入自己需要的应用函数即可。修改的文件路径如下luban-lite\bsp\examples\test-uart。</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图2 串口通讯例程位置</div>

<div><strong>代码:</strong></div>

<div>
<pre>
<code class="language-cpp">//uart.c

#include &lt;getopt.h&gt;
#include &lt;string.h&gt;
#include &lt;rtthread.h&gt;
#include &lt;aic_core.h&gt;
//#include "beep.h"

#define SAMPLE_UART_NAME "uart1"
#define TIMEOUT_NONE   -4096

static struct rt_semaphore rx_sem;
static rt_device_t serial;
static char str_send[] = "12";
uint8_t g_recv_max = 128;
static int g_uart_test_result = 1;
static int g_exit = 0;
static int g_timeout = TIMEOUT_NONE;

static rt_timer_tuart1_rx_timeout = RT_NULL;

char str_receive = {0};

typedef struct
{
    uint8_t buf;
    uint8_t len;
    uint8_t rx_over;
} uart_rx_dat_t;

uart_rx_dat_t uart1_rx_dat = { 0 };


static void uart1_rx_timeout_cb(void *p)
{
    rt_timer_stop(uart1_rx_timeout);
    rt_kprintf("read_length: %d \n", uart1_rx_dat.len);
    uart1_rx_dat.rx_over = RT_TRUE;
}

rt_err_t uart1_input(rt_device_t dev, rt_size_t size)
{
    char ch;
    //rt_sem_release(&amp;rx_sem);
    if(rt_device_read(serial, -1, &amp;ch, 1)==1)
    {
       uart1_rx_dat.buf = ch;
       rt_timer_start(uart1_rx_timeout);
    }
    return RT_EOK;
}

void serial_uart1_thread_entry(void *parameter)
{
    uint8_t jx=0;
    char ch;
    int ret = 0;
   
    int cnt = 0;
    static int timeout_time = 0;
    static uint8_t rx_one_byte_flag = 1;

    while (1)
    {
      if(uart1_rx_dat.rx_over == RT_TRUE)
      {
            uart1_rx_dat.rx_over = RT_FALSE;
            rt_kprintf("read_dat: ");
            for(jx=0; jx&lt;uart1_rx_dat.len; jx++)
            {
                rt_kprintf("%02x", uart1_rx_dat.buf);      
            }
            rt_kprintf("\n");   
             uart1_rx_dat.len=0;
            if( uart1_rx_dat.buf==0xff &amp;uart1_rx_dat.buf==0x2a)
            {
                if(uart1_rx_dat.buf==0x01)
                {
                   //beep_on();
                   rt_device_write(serial, 0, &amp;uart1_rx_dat, 4);
                  
                }
                else if(uart1_rx_dat.buf==0x00)
                {
                  //beep_off();
                  rt_device_write(serial, 0, &amp;uart1_rx_dat, 4);
                }
            }
      }
      rt_thread_mdelay(5);
    }
}

int test_uart_485(int argc, char *argv[])
{
    int c = 0;
    rt_err_t ret = RT_EOK;
    static rt_uint8_t open_cnt = 0;

    //查找串口设备
    serial = rt_device_find(SAMPLE_UART_NAME);
    if (!serial)
    {
      rt_kprintf("find %s failed!\n", SAMPLE_UART_NAME);
      return -RT_ERROR;
    }

    //初始化信号量
    rt_sem_init(&amp;rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);

    //打开串口设备
    ret = rt_device_open(serial, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
    if (ret != RT_EOK)
    {
      rt_kprintf("open %s failed : %d !\n", SAMPLE_UART_NAME, ret);
      return -RT_ERROR;
    }

    //设置接收回调函数
    rt_device_set_rx_indicate(serial, uart1_input);

    //rt_device_write(serial, 0, str_send, (sizeof(str_send) - 1));

    //创建 serial 线程
    rt_thread_t thread = rt_thread_create("serial", serial_uart1_thread_entry, RT_NULL, 1024*2, 26, 10);
    if (thread != RT_NULL) {
      rt_thread_startup(thread);
    } else {
      rt_device_close(serial);
      return -RT_ERROR;
    }

    //创建接收超时定时器
    uart1_rx_timeout = rt_timer_create("serial_timer", uart1_rx_timeout_cb, RT_NULL, 50, RT_TIMER_FLAG_PERIODIC);

    return ret;
}

MSH_CMD_EXPORT(test_uart_485,Uart Test);

</code></pre>

<p>&nbsp;</p>
</div>

<div>编写好代码之后需要进行硬件me配置,进入me之后,选择uart1 使能,配置其波特率,数据位停止位等等,并且要配置其为rs485 compact io。</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图3 开发板在me环境下,配置uart1</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图4 开发板在me环境下,配置为485 compact io</div>

<div>配置好之后记得保存,这里就可以正常编译了,编译完成之后,在调试串口中输入&ldquo;aicupg&rdquo;或者是按住uboot重新上电均可使开发板进入到烧录模式,这时我们选择烧录工具进行将刚刚编译好的固件进行烧录即可。</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图5 代码编译成功</div>

<div>烧录成功之后,就可以在调试串口界面输入test_uart_485命令,这个命令可以自己通过应用函数修改&ldquo;MSH_CMD_EXPORT(test_uart_485, Uart Test);&rdquo;</div>

<div>输入之后即可进入到485通讯功能。这里的应用我简单的写的是开发板收到485的数据之后,利用串口1再返回去,因此在串口调试助手工具中可以看到发送与接收内容相同</div>

<div style="text-align: center;"></div>

<div style="text-align: center;">图6 485测试界面</div>

<div>至此,关于485通讯部分已经调试通过了,在这里要感谢坛友@<a href="https://home.eeworld.com.cn/space-uid-362358.html" target="_blank">TL-LED</a>,感谢坛友的点拨可以快速实现485通讯的调试工作,通过在调试485通讯的过程中遇到了不少麻烦,首先是与正常的单片机裸机通讯不同,这个仅使用C文件就可以,并且每一个C文件相当于一个线程,也就是每个文件相当于一个单片机进行工作。这种感觉非常奇妙,也让我从单线程的裸机通讯逐步学习并了解多线程的通讯方式,接下来我将尝试实现显示功能,敬请期待~</div>

<div>&nbsp;</div>

<p><!--importdoc--></p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

CCCCCCCYYYY 发表于 2024-10-13 14:56

<p></p>


<p>非常感谢分享,受益匪浅,期待下次分享</p>
页: [1]
查看完整版本: 【匠芯创D133CBS】485的应用