Linux串口测试应用程序

2023-05-16

1 Linux终端(串口)

210开发板有4个串口  2440开发板有3个串口

在2440开发板中三个串口设备对应如下    
串口名字                      主设备号              次设备号
s3c2410_serial0            204                  64
s3c2410_serial1            204                  65
s3c2410_serial2            204                  66

有的系统里使用这三个名字  
ttySAC0  204  64
ttySAC1  204  65
ttySAC2  204  66

2、构建dev目录
    使用两种方法构建dev系统。

方法1:静态创建设备文件(节点)
    从系统启动过程可知,涉及的设备有:/dev/mtdblock*(MTD)(MTD块设备),/dev/ttySAC*(串口设备)、/dev/console、/devnull,只要建立以下设备就可以启动系统。
    
    在dev目录下:
    #mknod console c 5 1
    #mknod null c 1 3
    #mknod ttySAC0 c 204 64

方法2:使用mdev创建设备文件
    /*通过读取内核信息来创建设备文件的*/
#mount -t tmpfs mdev /dev    //使用内核文件系统,减少对flash的读写
    #mkdir /dev/pts            //dev/pts用来支持外部网络链接(telnet)的虚拟终端
    #mount -t devpts devpts /dev/pts
    #mount -t sysfs sysfs /sys    //mdev通过sysfs文件系统获得设备信息
    #echo /bin/mdev>/proc/sys/kernel/hotplug    //设置内核,当有设备插拔时调用/bin/mdev程序
    #mdev -s            //在/dev目录下生成内核支持的所有设备的节点

    要在内核启动时,自动运行mdev。需要修改两个文件:etc/fstab来自动挂载文件系统、修改etc/init.d/rcS加入自动运行命令。

    1:etc/fstab
    # device        mount-point    type    option          dump    fsck order
    proc            /proc          proc    defaults        0      0
    tmpfs          /tmp            tmpfs  defaults        0      0    //提高速度,减小磨损
    sysfs        /sys        sysfs    defaults    0    0    //告诉mdev有那些设备文件的操作
    tmpfs        /dev        tmpfs    defaults    0    0    //防止热热插拔时减少磨损
需要注意的是:开发板上通过mdev生成的/dev目录中,S3C2410的串口名是s3c2410_serial 0。需要修改etc/inittab文件。
    修改前:
    ttySAC0::askfirst:~bin/sh
    修改后:
    s3c2410_serial0::askfirst:~/bin/sh

3
对于mdev,需要注意的是,文件系统里存在/etc/mdev.conf文件,它包含了medv的配置信息。通过这个文件,我们可以自定义一些设备节点的名称或链接来满足特定的需要。这是root qtopia中mdev.conf的内容:
9.#console devices

10.tty[0-9]* 0:5 0660

11vc/[0-9]* 0:5 0660

12.    
13.  # serial port devices  
14.  s3c2410_serial0    0:5    0666    =ttySAC0  
15.  s3c2410_serial1    0:5    0666    =ttySAC1  
16.  s3c2410_serial2    0:5    0666    =ttySAC2  
17.  s3c2410_serial3    0:5    0666    =ttySAC3  
18.                                                                                                                                                          19.  # loop devices  
20.  loop[0-9]*    0:0    0660    =loop/  
21.    
22.  # i2c devices  
23.  i2c-0        0:0    0666    =i2c/0  
24.  i2c-1        0:0    0666    =i2c/1  
可以看到,原本串口驱动注册的设备名是 s3c2410_serial0, s3c2410_serial1 和
s3c2410_serial2,而 mdev 则会在/dev 目录下对应生成 ttySAC0, ttySAC1和ttySAC2以符合
应用程序对于串口设备名称的习惯



启动参数 来选择内核采用哪个端口  
init=/linuxrc console=ttySAC1,115200
noinitrd  root=/dev/mtdblock2  init=/linuxrc  console=ttySAC0,115200
noinitrd  root=/dev/mtdblock2  init=/linuxrc  console=s3c2410_serial0,115200

测试程序:

1

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <errno.h>
#include <termios.h>
#include <sys/time.h>
#include <signal.h>
#include <string.h>
#include <fcntl.h>
#include <asm/param.h>
#include "pthread.h"


int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
    struct termios newtio,oldtio;
    //保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息
    if ( tcgetattr( fd,&oldtio) != 0)
    {
        perror("SetupSerial 1");
        return -1;
    }
    //extern void bzero(void *s, int n); 置字节字符串s的前n个字节为零
    bzero( &newtio, sizeof( newtio ) );
    //设置字符大小
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_cflag &= ~CSIZE;
    //设置数据位
    switch( nBits )
    {
    case 7:
        newtio.c_cflag |= CS7;
        break;
    case 8:
        newtio.c_cflag |= CS8;
        break;
    }
    //设置校验位
    switch( nEvent )
    {
    case 'O':
        newtio.c_cflag |= PARENB;
        newtio.c_cflag |= PARODD;
        newtio.c_iflag |= (INPCK | ISTRIP);
        break;
    case 'E':
        newtio.c_iflag |= (INPCK | ISTRIP);
        newtio.c_cflag |= PARENB;
        newtio.c_cflag &= ~PARODD;
        break;
    case 'N':
        newtio.c_cflag &= ~PARENB;
        break;
    }
    //设置波特率
    switch( nSpeed )
    {
    case 2400:
        cfsetispeed(&newtio, B2400);
        cfsetospeed(&newtio, B2400);
        break;
    case 4800:
        cfsetispeed(&newtio, B4800);
        cfsetospeed(&newtio, B4800);
        break;
    case 9600:
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        break;
    case 115200:
        cfsetispeed(&newtio, B115200);
        cfsetospeed(&newtio, B115200);
        break;
    default:
        cfsetispeed(&newtio, B9600);
        cfsetospeed(&newtio, B9600);
        break;
    }
    //设置停止位
    if( nStop == 1 ){
        newtio.c_cflag &= ~CSTOPB;
    }
    else if ( nStop == 2 ){
        newtio.c_cflag |= CSTOPB;
    }
    
    //设置等待时间和最小接收字符
    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN] = 0;
    //处理未接收字符
    tcflush(fd,TCIFLUSH);
    //激活新配置
    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    {
        perror("com set error");//打印com set error及出错原因
        return -1;
    }
    printf("set done!\n");
    return 0;
}


int open_port(int fd,int comport)
{
    //char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
    long vdisable;//没用
    //打开串口
    if (comport==1)
    {  
        //fd = open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);
        fd = open("/dev/s3c2410_serial0",O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open s3c2410_serial0");
            return(-1);
        }
        else
            printf("open s3c2410_serial0 .....\n");
    }
    else if(comport==2)
    {  
        fd = open("/dev/s3c2410_serial1",O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open s3c2410_serial1");
            return(-1);
        }
        else
        {
            printf("open s3c2410_serial1 .....\n");
        }
    }
    else if (comport==3)
    {
        fd = open("/dev/s3c2410_serial2",O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open s3c2410_serial2");
            return(-1);
        }
        else
        {
            printf("open s3c2410_serial2 .....\n");
        }
    }
    else if (comport==4)
    {
        fd = open("/dev/s3c2410_serial3",O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open s3c2410_serial3");
            return(-1);
        }
    else
        printf("open s3c2410_serial3 .....\n");
    }
    //恢复串口的状态为阻塞状态,用于等待串口数据的读入
    if(fcntl(fd, F_SETFL, 0) < 0)
        printf("fcntl failed!\n");
    else
        printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
    //测试打开的文件描述符是否引用一个终端设备,以进一步确认串口是否正确打开
    if(isatty(STDIN_FILENO)==0)
        printf("standard input is not a terminal device\n");
    else
        printf("isatty success!\n");

    printf("fd-open=%d\n",fd);
    return fd;
}

 

unsigned int val=0;

 


int main(int argc, char **argv)
{
    long ret=0;
    int i;
    int fd,fdd;
    unsigned char buff[512];
        
    bzero(buff, 512);

    //串口4
    if((fd=open_port(fd,4)) < 0)//打开串口 2
    {
        printf("open_port error3\n");
        return -1;
    }
    if((i=set_opt(fd,115200,8,'N',1)) < 0)//设置串口 9600 8 N 1
    {
        printf("set_opt error2\n");
        return -1;
    }
    printf("fd=%d\n",fd);

    strcpy(buff,"HelloWorld");

    while (1)
    {
        write(fd,buff,sizeof(buff));//写数据
        sleep(1);
    }

 close(fd);
 return 0;  
}

 


2

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h> //文件控制定义  
#include <termios.h>//终端控制定义  
#include <errno.h>  
 
#define DEVICE "/dev/s3c2410_serial3"  
  
int serial_fd = 0;  
  
//打开串口并初始化设置 

init_serial(void)  
{  
    serial_fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);  
    if (serial_fd < 0) {  
        perror("open");  
        return -1;  
    }  
      
    //串口主要设置结构体termios <termios.h>  
    struct termios options;  
      
    /**1. tcgetattr函数用于获取与终端相关的参数。 
    *参数fd为终端的文件描述符,返回的结果保存在termios结构体中 
    */  
    tcgetattr(serial_fd, &options);  
    /**2. 修改所获得的参数*/  
    options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能  
    options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位  
    options.c_cflag &= ~CRTSCTS;//无硬件流控  
    options.c_cflag |= CS8;//8位数据长度  
    options.c_cflag &= ~CSTOPB;//1位停止位  
    options.c_iflag |= IGNPAR;//无奇偶检验位  
    options.c_oflag = 0; //输出模式  
    options.c_lflag = 0; //不激活终端模式  
    cfsetospeed(&options, B115200);//设置波特率  
      
    /**3. 设置新属性,TCSANOW:所有改变立即生效*/  
    tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读  
    tcsetattr(serial_fd, TCSANOW, &options);  
      
    return 0;  
}  
  
/** 
*串口发送数据 
*@fd:串口描述符 
*@data:待发送数据 
*@datalen:数据长度 
*/  
int uart_send(int fd, char *data, int datalen)  
{  
    int len = 0;  
    len = write(fd, data, datalen);//实际写入的长度  
    if(len == datalen) {  
        return len;  
    } else {  
        tcflush(fd, TCOFLUSH);//TCOFLUSH刷新写入的数据但不传送  
        return -1;  
    }  
      
    return 0;  
}  
  
/** 
*串口接收数据 
*要求启动后,在pc端发送ascii文件 
*/  
int uart_recv(int fd, char *data, int datalen)  
{  
    int len=0, ret = 0;  
    fd_set fs_read;  
    struct timeval tv_timeout;  
      
    FD_ZERO(&fs_read);  
    FD_SET(fd, &fs_read);  
    tv_timeout.tv_sec  = (10*20/115200+2);  
    tv_timeout.tv_usec = 0;  
      
    ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);  
    printf("ret = %d\n", ret);  
    //如果返回0,代表在描述符状态改变前已超过timeout时间,错误返回-1  
      
  
          
    if (FD_ISSET(fd, &fs_read)) {  
        len = read(fd, data, datalen);  
        printf("len = %d\n", len);  
        return len;  
    } else {  
        perror("select");  
        return -1;  
    }  
      
    return 0;  
}  
  
int main(int argc, char **argv)  
{  
    init_serial();  
  
    char buf[]="hello world";  
    char buf1[10];  
    uart_send(serial_fd, buf, 10);  
    printf("\n");  
  
    uart_recv(serial_fd, buf1, 10);  
      
      
    printf("uart receive %s\n", buf1);  
    close(serial_fd);  
    return 0;  


本篇转载自:http://www.linuxidc.com/Linux/2015-05/118023.htm

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux串口测试应用程序 的相关文章

  • 如何确定代码是否在信号处理程序上下文中运行?

    我刚刚发现有人正在从信号处理程序调用我编写的绝对不是异步信号安全的函数 所以 现在我很好奇 如何避免这种情况再次发生 我希望能够轻松确定我的代码是否在信号处理程序上下文中运行 语言是 C 但该解决方案不适用于任何语言吗 int myfunc
  • C++:Linux平台上的线程同步场景

    我正在为 Linux 平台实现多线程 C 程序 其中我需要类似于 WaitForMultipleObjects 的功能 在搜索解决方案时 我发现有一些文章描述了如何在 Linux 中实现 WaitForMultipleObjects 功能
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • ubuntu 的 CSS 更少(并且自动编译)? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我尝试过 simples 但现在 l
  • 使用 ProcessBuilder 运行 shell 脚本

    我正在尝试使用 Java 和 ProcessBuilder 运行脚本 当我尝试运行时 我收到以下消息 error 2 没有这样的文件或目录 我不知道我做错了什么 但这是我的代码 ps 我尝试只执行不带参数的脚本 错误是相同的 String
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 为什么docker容器提示“权限被拒绝”?

    我使用以下命令来运行 docker 容器 并从主机映射目录 root database 到容器 tmp install database docker run it name oracle install v root database t
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 如何将 elf 解释器(ld-linux.so.2/ld-2.17.so)构建为静态库?

    如果我的问题不准确 我深表歉意 因为我没有太多 Linux 相关经验 我目前正在构建一个 Linux 从头开始 主要遵循 linuxfromscratch org 版本的指南 7 3 我遇到了以下问题 当我构建可执行文件时 获取一个称为 E
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称
  • 隐式声明“gets”

    据我所知 隐式声明 通常意味着该函数必须在调用之前放置在程序的顶部 或者我需要声明原型 然而 gets应该在stdio h文件 我已包含 有没有什么办法解决这一问题 include
  • 如何通过不同的接口路由 TCP/IP 响应?

    我有两台机器 每台机器都有两个有效的网络接口 一个以太网接口eth0和 tun tap 接口gr0 目标是使用接口在机器 A 上启动 TCP 连接gr0但然后让机器 B 的响应 ACK 等 通过以太网接口返回 eth0 因此 机器 A 发出
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • Unix 中的访问时间是多少

    我想知道访问时间是多少 我在网上搜索但得到了相同的定义 读 被改变 我知道与touch我们可以改变它 谁能用一个例子来解释一下它是如何改变的 有没有办法在unix中获取创建日期 时间 stat结构 The stat 2 结构跟踪所有文件日期
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 为什么无论 -rdynamic 如何,backtrace 都不包含 Objective-C 符号?

    Update 我正在 Linux 上使用 GNU 运行时 问题是not发生在带有 Apple 运行时的 MacOS 上 更新2 我在 MacOS 上编译了 GNU 运行时并用它构建了示例 该错误确实not发生在带有 GNU 运行时的 Mac
  • Linux >2.6.33:可以使用 sendfile() 来实现更快的“猫”吗?

    必须将大量大文件连接成一个更大的单个文件 我们目前使用 cat file1 file2 output file but are wondering whether it could be done faster than with that
  • 命名互斥体的 Mono 替代方案

    在 Windows NET 上 命名的互斥体可用于同步多个进程 不幸的是 Mono 在 Linux 上不太支持这一点 他们的发行说明 http www mono project com Release Notes Mono 2 8 Shar

随机推荐

  • 如何关闭iOS系统自动更新提示?

    原文链接 xff1a https www zhihu com question 37297197 打开iPhone或者iPad的Safari浏览器 xff0c 复制以下网址并从自带浏览器打开 https oldcat me web NOOT
  • 大数据高级开发工程师——大数据相关工具之三 Maxwell

    文章目录 大数据相关工具Maxwell数据实时同步工具Maxwell 简介Maxwell工作原理MySQL Binlog 介绍1 Binlog简介2 Binlog的日志格式 Mysql 实时数据同步方案对比开启MySQL的BinlogMax
  • TF-IDF算法详解及sklearn代码实现

    目录 1 基本介绍 xff08 1 xff09 TF xff08 词频 Term Frequency xff09 xff08 2 xff09 IDF xff08 逆向文件频率 Inverse Document Frequency xff09
  • UEFI下Windows启动引导的顺序(附带linux双系统)

    这里均以64位系统 xff08 windows和linux均是 xff09 xff0c gpt分区 xff0c UEFI引导作为例子 xff0c 现在基本上不会不支持吧 windows下UEFI引导文件的载入顺序 主板启动windows的一
  • 在ROS环境下用yolov3-tiny训练自己的数据集

    由于整个过程新建 修改 设置的文件和参数较多 所以我先放张整个流程分析图在这 xff0c 方便大家结合下列步骤去更好理解 0 提前准备 xff1a 下载darknet xff08 yolov3 xff09 并编译 span class to
  • ROS下使用usb_cam驱动读取摄像头数据

    因为darknet ros会直接订阅指定的图像话题名 xff0c 然后对图像进行检测 xff0c 绘制检测框 xff0c 并发布相应的检测话题 xff0c 因此首先需要找一个能够发布图像话题的ROS包 xff0c 这里经推荐使用ROS官方提
  • python 各种加密

    背景 加密学习 对称加密 对称密钥加密 xff0c 又叫私钥加密 即信息发送的方和接受方用一个密钥去加密和揭秘数据 最大的优势是 加解密速度快 xff0c 适合对大量数据进行加密 xff0c 对称加密的缺点是密钥的管理和分配 xff0c 换
  • 参加中国移动开发者大会有感

    作为我校CSDN俱乐部的主席 xff0c 我很荣幸受到CSDN的邀请参加中国移动开发者大会 xff0c 下面写点自己的感悟 xff1a 移动互联网应用大时代已经到来 xff0c 所有的IT应用都将移动化 xff0c 所有的信息服务都将移动化
  • IntelD435摄像头将深度图与摄像头进行像素对齐(并抽帧保存)

    coding 61 utf 8 import pyrealsense2 as rs import numpy as np import cv2 import os 创建一个管道 pipeline 61 rs pipeline Create
  • python3 可视化COCO格式json文件目标检测矩形框

    import os import json import argparse from PIL import Image ImageDraw ImageFont FONT SIZE 61 13 2 IMAGE FONT 61 ImageFon
  • 对比图像清晰度(模糊度)之灰度方差算法 python代码实现

    灰度方差算法 图像最清晰 xff0c 图像中的高频分量也最多 xff0c 该算法以图像所有像素的灰度平均值为参考 xff0c 对每个像素点的灰度值求差后求平方和 xff0c 然后用像素总数标准化 xff0c 它表征了图像灰度变化的平均程度
  • pytorch使用 ROIalign 代码实例

    batch size 61 x shape 0 all roi align feats 61 for i in range batch size hmap1 s 61 out hmap 1 i hmap1 s 61 hmap1 s unsq
  • python resize dicom(dcm)代码

    from glob import glob import os import pydicom import numpy as np import cv2 dcm list 61 sorted os listdir 39 xxxx 39 fo
  • 基于opencv和ffmpeg的图片转换成视频的两种方法实现,可生成H264格式

    opencv转换图片为视频 xff08 生成视频格式为MJPG xff09 encoding UTF 8 import glob as gb import cv2 图片文件夹地址 img path 61 gb glob 34 G temp
  • VGG16提取图片特征

    import os import numpy as np import torch import torch nn import torchvision models as models from torch autograd import
  • 防火墙之数据包过滤iptables

    内容简介 防火墙的概述 1 iptables简介 2 iptables基础 3 iptables语法 4 iptables实例 案例详解 xff08 一 xff09 防火墙的简介 防火墙是指设置在不同网络或网络安全域之间的一系列部件的组合
  • Ubuntu apt-get 和 pip 更换源

    Ubuntu系统自带的源都是国外的网址 xff0c 国内用户在使用的时候网速比较慢 一个软件的下载是十分痛苦的 xff0c 这里讲解一下如何将国外源更换为国内源 xff0c 让你的网速Biu Biu Biu 更换apt get数据源 1 备
  • Linux如何解决动态库的版本控制

    xff08 换句话说 xff0c soname不是真实存在的文件 xff0c 只是在此库中和将来调用此库的文件中保存的一个名字 xff0c 在加载时去找这个名字 xff0c 使用时创建一个软连接来指向真实文件 xff0c 这样真实文件的版本
  • C语言中可变参数函数实现原理

    C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关 xff0c 正常情况下C的函数参数入栈规则为 stdcall 它是从右到左的 xff0c 即函数中的最右边的参数最先入栈 例如 xff0c 对于函数 xff1a void f
  • Linux串口测试应用程序

    1 Linux终端 串口 210开发板有4个串口 2440开发板有3个串口 在2440开发板中三个串口设备对应如下 串口名字 主设备号 次设备号 s3c2410 serial0 204 64 s3c2410 serial1 204 65 s