Air724UG开发板串口教程

Posted zko0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Air724UG开发板串口教程相关的知识,希望对你有一定的参考价值。

1、前言

这块板子是毕业设计老师替选的,出自合宙。使用Lua5.1,包含部分外部lib包。

缺点:

  1. 官方宣传的Luat合宙全系列通用,在Air724ug上是无法使用的

  2. 该开发板使用Lua5.1,缺少了较多常用的Api,需要外部lib补充,往往也很难查询

  3. 开发板型号多种多样,官方教程使用开发板往往和你的不同。如果你没有Pcb及电路经验,不推荐使用,因为你很有可能不知道怎么使用

  4. 使用人少,出现问题较难搜索查询

优点:

  1. 使用Lua作为语言(虽然是5.1)
  2. 合宙包含LuaTask框架,非常易用
  3. 官方的工具很好用,调试方便
  4. 官方提供demo

2、内容

①开发板版本

本文使用Air724UG A13开发板,如下图

②电路查看

该开发板存在两个可使用的uart,分别为uart1,uart2。

在Air724UG的芯片中,使用uart需要给一个参考电平,而在开发板中,默认给uart电平为1.8v。

如果你的通讯串口不符合该电平有两种做法:

  1. 使用开发板提供的串口电平转换电路(该开发板只有一个)
  2. 外搭串口电平转换电路

针对于1,我们看一下电路图:

首先uart1,2串口电平1.8v连接串口选择开关:

下面继续往下看,下图从右向左看:

首先串口选择的uart,输出进入电压转换电路,电压转化电路的vcc连接3.3v,故该电路实现3.3v与1.8v转换。

转换电路左侧,连接有两个方向。连接1为:ch330,连接2为:DIP3X1-2.54(即为我们自行焊接的三个排针)

这两个连接,通过开关进行选择:

当3,4ON,则CH330打开,micro usb通路(可以进行电脑的调试通信)

当3,4OFF,则CH330关闭,micro usb断路

DIP3X1-2.54是默认连接的,使用时连接,不使用时自己断开杜邦线,如果进行通讯建议关闭CH330,以免产生影响。

③Demo

3,4ON,使用micro usb连接电脑测试

或者使用外部的3.3v串口进行通讯,连接自行焊接的排针:GND,TX,RX

myuart.lua:

module(..., package.seeall)
require "utils"
require "pm"
-- 串口的序号,本次测试程序用的是第一个串口,ID数值为1
local UART_ID = 1
-- 串口定时处理数据,每100毫秒处理一次数据。一旦收到的新的数据立刻发送回去
local function taskRead()
    local dataBuffer = ""
    local frameCnt = 0
    while true do
        -- 设置读取到结束符或者阻塞时发送数据
        local receiveData = uart.read(UART_ID, "*l")
        -- 如果没有收到数据
        if receiveData == "" then
            if not sys.waitUntil("UART_RECEIVE", 100) then
                -- 判断现在的数据是否为空
                -- 数据不为空
                if dataBuffer:len() > 0 then
                    write(dataBuffer)
                    dataBuffer = ""
                end
            end
        else
            dataBuffer = dataBuffer .. receiveData
        end
    end
end

function write(data)
    uart.write(UART_ID, data .. "\\r\\n")
end
-- 保持文件处于唤醒状态
pm.wake("myuart")
-- 注册接收数据
uart.on(UART_ID, "receive", function()
    sys.publish("UART_RECEIVE")
end)
-- 串口配置
uart.setup(UART_ID, 115200, 8, uart.PAR_NONE, uart.STOP_1)
-- 启动串口接收数据任务
sys.taskInit(taskRead)

main.lua:

PROJECT="UART"
--版本号
VERSION="1.0.0"
--载入系统文件
require"sys"
--载入串口实现文件
require"myuart"
--启动系统框架
sys.init(0, 0)
sys.run()

在 S5PV210 的 开发板上 使用 串口 收发信息

 

参考学习教程:周立功嵌入式Linux开发教程-(上册)

 

材料:首先 准备一个 安装好 Linux 的 开发板  

 使用  xshell 工具 连接 开发板  ,winscp 工具 连接 开发板  ,  准备 一个 Ubuntu  32位 ,装上 交叉编译链。。

使用下面 代码 和 Makefile 文件 进行编译  ,生成的  执行 文件  利用 winscp 软件复制到 Linux开发板上 ,利用 xshell 运行 这个可执行文件。

 

下面    代码的  功能  是   打开 串口 ,进行 等待接收 串口的 数据 ,接收完毕 后 利用 printf 打印出来 ,然后给串口返回一个  hello ,这个 是 在 led的 基础上更改的 。。。2017年6月29日10:31:03

 

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <string.h>

//socket 头文件 2017年6月28日09:40:47,所长
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <stdbool.h>

#define LED_PATH             "/sys/devices/platform/x210-led"

#define UART0_PATH          "/dev/ttyS0"

#define OPEN_LED            "1"
#define OFF_LED                "0"

#define LED1            1
#define LED2            2
#define LED3            3
#define LED4            4

#define ledOperationTypeOPEN    1
#define ledOperationTypeOFF        0

#define SERVER_IP    "192.168.10.11"
#define SERVER_PORT    ((uint16_t)7007)

int led(int ledNumber,int ledOperationType)
{
    
    char path[40],data[2];
    
    int fd, ret, flag;

    strcpy(path, LED_PATH);
    
    if       ( ledNumber == 1 )
        strcat(path, "/led1");
    else if( ledNumber == 2 )
        strcat(path, "/led2");
    else if( ledNumber == 3 )
        strcat(path, "/led3");
    else if( ledNumber == 4 )
        strcat(path, "/led4");
    else
        return -1;
    
    printf("打开路径%s文件",path);
    
    fd = open(path, O_RDWR);//打开/sys/devices/platform/x210-led路径下的 led ledNumber 文件
    
    if( fd < 0 ) //判断是否打开失败
    {
        perror("open");
        return -2;
    }
    else
    {
        printf("led%d 文件打开成功.\r\n",ledNumber);
    }

    
    if( ledOperationType == 1)
        ret = write(fd, OPEN_LED, strlen(OPEN_LED) );//文件写入内容: OPEN_LED
    else if( ledOperationType == 0)
        ret = write(fd, OFF_LED, strlen(OFF_LED) );     //文件写入内容: OFF_LED
    else
        return -3;
    
    if( ret < 0 ) 
    {
        perror("write");
        return -4;
    }
    else
    {
        flag =1;
        printf("led%d 文件写入ledOperationType(1:打开LED 0:关闭LED): %d 数据成功.\r\n",ledNumber,ledOperationType);
    }

/*     for(;;)
    {
        
        //闪烁 LED1
        
        if( flag == 1 )
        {//如果LED灯 是打开的状态 就关闭LED灯
            flag = 0;
            ret = write(fd, OFF_LED, strlen(OFF_LED) );//文件写入内容:  OFF_LED
        }
        else
        {//如果LED灯 是关闭的状态 就打开LED灯
            flag = 1;
            ret = write(fd, OPEN_LED, strlen(OPEN_LED) );//文件写入内容:OPEN_LED
        }
        
        
        sleep(1);
        
        
    } */
    
    printf("关闭文件,退出进程!\r\n");
    
    close(fd);//文件写入完毕后 要进行关闭文件
    
    return 0;
    
}

int main(int argc, char *argv[])
{
    int flag =0 ;
    
    int fd;
    int len, i,ret;
        char buf[64] = "hello GXP!";
        
        char responseMessage[64] = "hello GXP!\r\n";


    fd = open(UART0_PATH, O_RDWR | O_NOCTTY);
        if(fd < 0) {
                perror(UART0_PATH);
                printf("打开串口0 失败!\r\n");
                return -1;
        }
        else
        {
            printf("打开串口0 成功!\r\n");
        }

      for(;;)
    {
        
        (void)memset(buf, 0, sizeof(buf));

        len =     read(fd, buf, sizeof(buf));
        
            if (len < 0) 
            {
                printf("read error \n");
                return -1;
            }

        printf("%s", buf);
        
        len = write(fd, responseMessage, strlen(responseMessage));
        
        if (len < 0) 
        {
            printf("write data error \n");
        }

    }
    
/*       for(;;)
    {
        //闪烁 LED1
        
        if( flag == 1 )
        {//如果LED灯 是打开的状态 就关闭LED灯
            flag = 0;
            led( LED1 ,ledOperationTypeOFF  );
        }
        else
        {//如果LED灯 是关闭的状态 就打开LED灯
            flag = 1;
            led( LED1 ,ledOperationTypeOPEN );
        }
        
        sleep(1);

    } */  
    
    return(0);
    
}

 

 

注意 下面 是 Makefile 文件  :  其中 arm-gcc-linux  在 安装交叉 编译器 的时候被我 重定义了  应该是 :arm-none-linux-gnueabi-gcc

 

CFLAGS += -Wall
obj := uart 
src := uart.c
CC  := arm-linux-gcc 

$(obj): $(src)
    $(CC) $(CFLAGS) $^ -o [email protected] -g

.PHONY: clean
clean:
    -rm $(obj) 

 

以上是关于Air724UG开发板串口教程的主要内容,如果未能解决你的问题,请参考以下文章

001-STM32+Air724UG基本控制篇(华为云物联网平台)--测试STM32+Air724UG(4G模组),Android,微信小程序等连接华为云物联网平台

04-STM32+Air724UG(4G模组)远程升级篇OTA(自建物联网平台)-STM32+Air724UG实现利用http或https远程更新STM32程序(TCP指令,单片机程序检查更新,精简内

Arduino与Air800开发板使用UART通信:传输DHT22传感器数据

GPRS(Air202) Lua开发: 硬件使用说明

位掩码和 Air724 LTE 模块

微信小程序+阿里物联/Onenet物联+esp32搭建无服务器物联系统---ESP32硬件设计开源