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

所长 所长     2022-09-06     129

关键词:

 

参考学习教程:周立功嵌入式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 文件打开成功.
",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 数据成功.
",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("关闭文件,退出进程!
");
    
    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!
";


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

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

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

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

    }
    
/*       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) 

 

arm芯片(s5pv210芯片)——串口通信详解

1、电子通信的基本概念1.1、同步通信和异步通信1.同步通信:通信双方有统一的工作节拍,一般需要发送方给接收方发送信息的同时发送时钟信号,接收方根据发送方给它的时钟信号来安排自己的工作节奏。同步通信... 查看详情

s5pv210启动烧写过程信息

...微信15359287133,公众号:厦门亲亲台宝)通过串口烧的信息:>OEMInitLIbisSuccess+++InitializeInterrupt()---Initialize 查看详情

在s5pv210的开发板上点亮一个led灯

 参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先准备一个安装好Linux的开发板  使用 xshell工具连接开发板 ,winscp工具连接开发板 , 准备一个Ubuntu 32位,装上交叉编译链。。使用下... 查看详情

第一章之s5pv210启动顺序

我所使用的开发板是:友善之臂smart210,cpu为s5pv210.u-boot版本是:u-boot-2012-101,首先在u-boot中配置相对应的开发板的配置文件#makes5p_goni_config2,设事先编译好的交叉编译器放在Makefile中添加上去,打开Makefile在67行补充CROSS_COMPILE?=arm-linux-... 查看详情

s5pv210开发板常用易忘操作记录

一、调试串口2、SD卡槽  查看详情

s5pv210开发系列八_yaffs的移植

S5PV210开发系列八Yaffs的移植象棋小子   1048272975Nand作为市面上最基本的非易失性闪存技术之中的一个,应用在各种固态大容量存储解决方式中。因为Nandflash自身的特点,Nand存储器往往须要一款专用的Nand文件系统进行... 查看详情

s5pv210|微处理器启动流程(代码片段)

...动失败时的iROM第二次启动顺序用于引导代码描述的标题信息数据编写校验和示例代码S5PV210启动概述S5PV210支持从多种设备启动,如OneNAND、NAND、MMC等。S5PV210的启动框图如图所示,BL0是指S5PV210微处理器的IROM中固化的启动代码,BL1... 查看详情

s5pv210_串行通信

1、universalasynchronousreciverandtransmitter通用异步收发器2、transmitter:由发送缓冲区和发送移位器构成。发送信息时,首先将信息编码(一般用ASCII码)成二进制流,然后将一帧数据(一般是8位)写入发送缓冲区,发送移位器会自动... 查看详情

s5pv210串口实验(中断方式)

结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验。start.S.global_start.globalIRQ_handle_start:/*关WatchDog*/ldrr0,=0xE2700000movr1,#0strr1,[r0]/*设置系统模式栈指针*/ldrsp,=0x40000000/*开IRQ总中断开关*/movr0,#0x53msrCPS... 查看详情

s5pv210移植minigui3.0.12

移植平台:ubuntu:14.04 开发板:s5pv210(A8) Minigui版本:3.0.12-----------------------------------------------------以下软件是开发板正常运行的必须安装包,在MiniGui官网可以下载http://www.minigui.org/zhcn/【已放在嵌入式软件组资料共享文件夹】--... 查看详情

嵌入式开发综述

0、嵌入式系统开发流程:   1、S5PV210内部结构图2、S5PV210系统启动三阶段正解     根据S5PV210芯片手册第6章所述S5PV210consistsof64KBROMand96KBSRAMasinternalmemory(意思210芯片有两块片上内存,ROM:64KB,SRAM:96KB),并... 查看详情

tiny210(s5pv210)移植u-boot(基于2014.4版本号)——移植u-boot.bin(打印串口控制台)

   在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印。在上节。我们看到调用relocate_code重定位。在u-boot的帮助文档doc/README.arm-relocation中对重定位有说明。u-boot为了生成位置无关码,在... 查看详情

s5pv210使用的启动方式

2017年12月25日1.S5PV210存储配置:  +内置64KBNorFlash(上电不需要初始化)(叫IROM内部外存):用于存储预先设置的BL0;  +SoC内置96KBSRAM(上电不需要初始化)(叫IRAM) :用于加载,存储,运行BL1;  +外接的大容量NandFlash(硬盘,上... 查看详情

s5pv210移植无线wifi网卡mt7601

一、准备工作1、MT7601驱动下载点击下载2、插入usbWiFi启动开发板linux,lsusb查看usb驱动Bus001Device003:ID148f:7601看到的是该驱动的厂家设备信息3、解压源码到linux下,确认USB的VID和PID,在rtusb_dev_id.c中USB_DEVICE_IDrtusb_dev_id[]=#ifdefRT6570USB_D... 查看详情

s5pv210的时钟系统概述

...钟)1.为什么要时钟系统?SoC内部有很多器件,譬如CPU、串口、DRAM控制器、GPIO等内部外设,这些东西要彼此协同工作,需要一个同步的时钟系统来指挥2.为什么要内部先高频然后再分频?主要因为SoC内部有很多部件都需要时钟,... 查看详情

嵌入式开发(s5pv210)——adc和触摸屏

1、ADC介绍ADC(analogdigitalconverter)就是AD转换,把模拟量转换为数字量。CPU本身是数字的、离散的,而外部世界却是模拟的、连续的,所以外界的信息是不能直接被计算机进行处理,需要先将模拟量转换为数字量... 查看详情

s5pv210开发板用汇编设置栈和调用c语言(代码片段)

使用C语言前为什么要先用汇编设置栈?C语言程序运行时需要栈,因为C语言中的局部变量都是用栈来实现的,如果没有设置栈就使用C语言,局部变量就会落空,程序就会死掉,所以在使用C语言前,我... 查看详情

s5pv210裸机程序之重定位与链接脚本

s5pv210开发板要求代码在0xD0020010处开始执行(BL1),但是有时我们的程序需要重定位在另外一个地址执行(如uboot),这个时候需要我们在汇编代码处加入重定位操作的代码,使得程序能够长跳转到另外一个地址继续执行代码而... 查看详情