精华内容
下载资源
问答
  • DSP之外部设备连接接口之HPI

    万次阅读 2012-08-16 22:21:35
    通过主机借口HPI,外部主机可以直接访问DSP内部的双访问RAM(DARAM). ...HPI提供了一个16位宽的并口,使用14位地址,每个地址装一个16位的字。 HPI能直接访问其他的外设寄存器,如果主机需要从其他外设

          通过主机借口HPI,外部主机可以直接访问DSP内部的双访问RAM(DARAM).

          HPI可以让外部的主处理器直接访问DSP内存映射中的部分内存,而无需DSP干预。通过主机接口还可以完成DSP的程序引导,DSP向主机发出中断信号要求主机响应中断等功能。HPI提供了一个16位宽的并口,使用14位地址,每个地址装一个16位的字。

    HPI不能直接访问其他的外设寄存器,如果主机需要从其他外设获取数据,则必须通过CPU或6个DMA通道中的一个,先将数据搬到DARAM中,反之依然。

          主机在HPI外部地址线上的地址,当成字地址,而不是字节地址来对待。

          HPI的14根地址线,使主机可以访问到内部的地址为000060H~003FFFH的双访问RAM(DARAM)。0~00005Fh为MMR保留,HPI不能访问。

          在所有的C5509上,HPI和EMIF共享一个并口。EBSR(外部总线选择寄存器)中的并行端口位决定这个端口用于数据EMIF模式(00b),完全EMIF(01b),非复用HPI(10b)或者HPI模式(11b)。并口模式位的复位值由复位时GPIO 0引脚的状态决定。复位是GPIO 0引脚为高,是完全EMIF模式,低,复用HPI模式。

         HPI信号简介

    信号名称
    类型
    说明
    HD[15:0]
    输入/输出/高阻
    主机数据总线
    在非复用模式下,只传输数据信号;复用模式下传输数据和地址信号
    HA[19:0]
    输入
    主机地址总线
    复用模式下传输主机到HPI口的地址信号;复用模式下HA[1]变成HCNTL1HA[2]变为HAS_,其他引脚没有使用
    HBE[1:0]
    输入
    主机字节选择信号,但在TMS320VC55102.0版本之后不再支持该信号
    HCS_
    输入
    片选信号,低有效
    HR/W_
    输入
    读写信号

    HDS1_,HDS2_
    输入
    数据选通信号,HPI接口的数据选通信号是这两个信号的同或结果。选通信号至少应持续2CPU周期,HDS1_HDS2_号的连接根据主机选通信号而对应不同的接法。
    主机有独立的读写选通信号,并且低有效,则一个接HDS1_,一个接HDS2_主机只有一个低有效的选通信号,则这个信号接到HDS1_HDS2_之一,而另一个引脚接高电平;主机有一个高有效地选通信号,则这个信号接HDS1_HDS2_,另一个引脚接低电平
    HRDY
    输出
    EHPI就绪信号。当这个信号为低时,标志EHPI接口忙,主机应延长传输周期,信号为高时,表示传输过程已经结束,主机可以继续下一次传输。当HCS_信号为高时,HRDY信号总为

    HCNTL0HCNTL1
    输入
    EHPI口控制信号
    非复用模式下HCNTLO为低时,EHPI接口将访问数据存储器,为高时访问EHPI控制寄存器,HCNTL1被地址线占用;复用模式下,HCNTL1HCNTL0信号用来选择访问的寄存器类
    HCNTL[1:0]           寄存器访问类型
           00                      HPIC读或写
           01                      HPID读写,并且访问后地址自动增加1
           10                      HPIA读写
           11                      HPID读写,访问后地址不增加
    HAS_
    输入
    地址选通信号,该信号只在复用模式下起作用,这个信号使得HCNTL[1:0]HR/W_信号可以在访问结束之前就消失
    HMODE
    输入
    EHPI模式选择信号,当为高时EHPI接口工作在非复用模式下,为低工作在复用模式下
    RST_MODE
    输入
    复位模式信号,但该信号在高版本C55x处理器中已经不再支持
    HINT_
    输出
    DSP到主机中断信号,该信号受状态寄存器ST3_55HINT位控制

    1 HPI接口的非复用连接方式

            非复用模式下,HPI口地址和数据分别使用单独的总线,接下来给出C55x DSP通过HPI接口采用非复用方式访问另一个C55x DSP的信号连接图。
            图中DSP1的通用IO信号IO7用来选通数据寄存器或者控制寄存器,图中没有标出的EHPI口信号不连接即可。非复用连接方式下数据和地址分别使用不同的总线,地址信号不必再通过EHPI数据总线传递,访问更加方便、快捷。

        1, 不使用HPIA HPI地址寄存器。对于每次传输的地址,必须在HA上给定。

        2.HPID HPI数据寄存器的作用是,临时保存通过HPI传送的数据。如果当前的访问是读操作,HPID保存从DSP存储器中读取的数据,如果是写操作,保存要写给DSP的数据。DSP CPU不能访问HPID.

        3.HPIC 包含了DSPINT位,使主机可以发送中断请求给DSP, DSP CPU不能访问HPIC。

    特点:

        1 数据和地址使用分开的总线。

        2 主机用HCNTL0和HR/W信号来说明周期类型。

           包括:

                     主机驱动HCNTL0引脚上的电平,来选择访问类型。0 HPIC访问,1 HPID访问。

                     主机通过HR/W引脚来选择传输方向。 高 读 低 写

     

    2  EHPI接口的复用连接方式
             EHPI口如果采用复用连接方式,地址和数据则都将通过数据总线传递,接下来给出PCI总线控制器PCI2040同C55x EHPI口的连接图。
             PCI2040是为C54x和C6000系列处理器通过HPI接口连接到PCI总线专门提供的,但由于C55x处理器的主机接口数据总线由C54x的8位变为16位,因此C55x是模拟C6000的HPI接口同PCI2040相连接的,由于C6000的HRDY信号为低有效,而C55x的HRDY为高有效,因此C55x的HRDY信号必须通过一个非门连接到PCI2040上。PCI2040没有HAS信号,故而C55x中的HAS_信号接到高电平。

         复用模式下:

                 1 地址和数据在同一条总线(HPI数据总线,HD[15:0])上传输,因此需要地址寄存器HPIA来存放地址,但HPIA是16位寄存器,主机必须写一个16位地址,其中bit13~0是真正地址,15~14为0,且在读写操作前,必须加载HPIA。

                 2 HPID与非复用模式一样。

                 3 HPIC 也是。

          特点:

                 地址和数据共用数据总线HD

                 主机用HCNTL[1:0]和HR/W信号来表示周期类型。

                 HAS允许HCNTL[1:0]和HR/W在访问周期内先撤销,可以有更多时间将总线状态从地址转为数据。HAS对主机是个可选信号,用一个总线来装载地址和数据,HPI可以不用HAS,将其拉高。

    3 EHPI口的寄存器

            EHPI有下列寄存器:数据寄存器(HPID)、地址寄存器(HPIA)和控制寄存器(HPIC),数据寄存器是一个16位寄存器,用来存放输入、输出的数据,在非复用方式下,该寄存器只起缓存作用,对主机来说该寄存器是透明的;而复用方式下,主机对DSP内存的访问都必须经过数据寄存器,DSP再根据地址寄存器中的地址访问数据存储器。地址寄存器是一个16或20位寄存器,该寄存器保存复用方式下读写操作的地址,而地址寄存器也将根据HCNTL1和HCNTL0的状态决定访问结束后寄存器内的地址是否加1,地址寄存器在非复用方式下不起作用。
            控制寄存器HPIC控制数据的传输,主机还可以通过该寄存器向DSP发出中断,要求DSP响应中断,另外主机通过控制HPIC中的RESET位,在DSP复位引脚为高时可以控制DSP的复位或使DSP脱离复位状态。

    HPIC寄存器的说明

    字段
    复位值
    说明
    15~6
    Reserved

     

    保留
    5
    XADD
    0
    1
    扩展地址使能位。在复用模式下如果使用20位地址,则须通过设置该位决定访问的是HPIA19~16位还是15~0位。
    写到HPIA15~0位;
    写到HPIA19~16
    4~2
    Reserved

     

    保留
    1
    DSPINT
    0
    1
    主机对DSP的中断申请位。
    清除DSPINT
    DSP发出中断申请
    0
    RESET
    0
    1
    复位。
    清除复位;
    使DSP停止进入复位状态

     

    利用RESET位,主机可以通过软件使DSP进入复位状态,在该状态下,主机可以对DSP进行程序加载,加载完成之后清除复位标志,如果DSP设置的是EHPI引导,在主机清除复位标志后,DSP接下来将从10000h地址开始执行程序。下图给出了通过EHPI口加载DSP程序的流程.

    通过EHPI口加载程序的过程
     
    注意:
              HPI不属于任何idle域,因此,不能进入idle模式。然而:
              1 如果时钟发生器idle域,或DMA idle域处于idle,主机不能访问DSP的存储器。
              2 DSP 在EBSR中,包含一个主机模式idle 位HIDL。若为0,时钟发生器不能进入idle模式,为了使HPI工作,它保持激活状态,若为1,时钟发生器可以进入idle状态。
              HPI依靠DMA控制器工作,因此仿真影响了DMA控制器,也会影响HPI。DMA的FREE位决定遇到仿真断点和其他仿真中断时的行为:
              0 复位后的值,中断将DMA挂起。
              1 不会中断DMA传输
         DSP进入复位状态,HPIC强制恢复其默认值,HPIA和HPIA不会被DSP初始化。 
      

     

    展开全文
  • 外部设备

    对外部设备的访问有两种不同的形式,分别是内存映射式和I/O映射式;

    (1)在内存映射式的CPU中,外部设备的存储单元,如控制寄存器,状态寄存器,数据寄存器等,都是作为内存的一部分出现在系统中的;CPU可以像访问一个内存单元一样访问外部设备的存储单元,因此不需要专门设立用于访问外设的I/O指令;

    (2)I/O映射式的CPU中,CPU不可以像访问一个内存单元一样访问外部设备的存储单元,因此需要专门设立用于访问外设的I/O指令,如IN,OUT;但是用于I/O指令的“地址空间”相对来说是很小的;


    其实I/O映射式的方式是适合早期的计算机技术,那时外设通常只有几个寄存器,通过这几个寄存器就可以完成所有的操作了;现在,比如PC机上有一个图像卡,带2MB的内存以及一小块ROM(装有可执行的代码),所以不管采用上述的哪两种映射方式,linux内核都通过ioremap()将外设卡上的存储器映射到虚存空间;


    对于内存页面的管理,通常我们都是现在虚存空间上分配一个虚存空间,然后为此区间分配相应的物理内存从而建立起映射,而这样的映射并不是一次性完成的;而在ioremap()中,我们先有一个物理存储空间,其地址就是外设卡上的存储器出现在总线上的地址,而这个地址未必是这个外设卡上存储器上的存储单元的地址,而是在总线上由CPU所看到的地址,这中间经历了地址映射,但是对CPU来是透明的,把上述地址称为“总线地址”,比如图形卡放到PCI的总线上;在linux系统中,CPU不是按物理地址访问内存的,而是建立起映射的虚存空间来找的;


    (1)在ioremap()中首先是一些检查,检查的区间大小不能是0,也不能是超越了超过32位的地址空间,物理地址在0xA0000至0x10000已系统初始化时虚存空间映射好,可直接使用了;phys_addr小于high_memory时,要检查是否与原有的物理空间冲突,然后还要确保地址边界对齐;


    (2)在get_vm_area()中,内核中有专用的一个续存空间队列vmlist,这是由一串vm_struct数据结构组成的一个单链队列;high_memory标志着具体物理内存上限所对应的虚拟地址;当内核需要一片虚存地址空间时,就从这个地址的8MB处来分配,主要是为了捕捉可能的越界访问;而后的每一个vmalloc()都用4KB来捕捉可能越界访问;找到vmlist中地址适合的vm_struct;



    (3)在remap_area_pages()中,是使用内核专用的mm_struct(init_mm故不属于任何的task_struct,不接受kswapd的换出调度)的,根据起始地址从init_mm中找到所属的目录项,然后根据区间的大小走遍所有涉及的目录项,对所有的页面目录表和页面表建立映射;

    展开全文
  • Service: 监听外部存储设备

    千次阅读 2012-05-25 23:50:33
    博客声明: 1. 使用 android2.1 源码说明问题 ...结合 Service 与 Broadcast 监听外部存储设备的状态,通过测试主要想知道在我们操作外部存储设备时候发生了哪些事情、以及 Intent 几 Action 到底是何意?

    博客声明:


    1. 使用 android2.1 源码说明问题


    2. 使用真机,操作系统是 android-2.1


    3. 分享一下学习方法,不是为了测试而测试,请大家举一反三


    结合 Service 与 Broadcast 监听外部存储设备的状态,通过测试主要想知道在我们操作外部存储设备时候发生了哪些事情、以及 Intent 几个 Action 到底是何意?


    测试代码见 附录,至于如何启动这个 Service,随您意!


    主要的 Action 


                                     



    注册这 13 个 action,然后运行 app ,点击 back 服务退至后台。


    now,ready!来操作 sdcard。


    1.  直接拔掉 sdcard



    2.  再次将 sdcard 插入卡槽





    先大概 1-3 秒的 media checking,然后才是 mounted -- scanner started -- scanner finished


    3.  在通知栏卸载 sdcard





    紧接着,从卡槽拔出 sdcard(必须拔出,才会接收到下面的 action)




    可以看出,这种情况属于正常卸载 sdcard,不是强制拔出。不同于 1.


    这个时候,你将 sdcard 插入卡槽,发生的情况与 2 一致。



    4. 在通知栏选择 "计算机与 sd 卡之间复制文件",即共享


    在弹出的对话框选择 "装载"




    然后,我们再次在通知栏选择 "关闭 usb 存储设备",接下来发生的与 2 一致。



    从这几个测试,我们可以发现几个规律:


    1.  不管以何种方式卸载(正常卸载拔出、正常卸载不拔出 sd 卡、直接拔出 sd 卡


    系统都会发出下面的 action 广播


    ACTION_MEDIA_EJECT


    ACTION_MEDIA_UNMOUNTED



    2.  不管以何种方式安装 sd 卡,系统都会发出下面的 action 广播




    3.  ACTION_MEDIA_REMOVED 与 ACTION_MEDIA_UNMOUNTED 区别



    ACTION_MEDIA_REMOVED 


    表示 sdcard 已经从卡槽移除。


    ACTION_MEDIA_UNMOUNTED 


    只可以说明 sd 卡没有 mount 在文件系统上面,不可以说明其已经从卡槽移除。


    从测试 4 就可以看出这个端倪。



    4.  ACTION_MEDIA_REMOVED 与 ACTION_MEDIA_BAD_REMOVAL 区别



    ACTION_MEDIA_BAD_REMOVAL 


    只有在直接拔出 sd 卡时,系统才会发送这样的 action 广播。


    ACTION_MEDIA_REMOVED 


    不管何种方式从卡槽拔出 sd 卡时,系统就会发送这样的 action 广播。



    5.  选择通过 usb 共享,系统一定会发出下面的 action 广播


    ACTION_MEDIA_SHARED



    ok,明白上面的道理(你基于的开发平台是否是这样,你还需要测试,我这里只是抛砖引玉),可以在接收到这些广播的时候,根据 action 写自己的逻辑代码了。如:


            @Override
    	public void onReceive(Context context, Intent intent) {
    		final String action = intent.getAction();
    		if (Intent.ACTION_MEDIA_EJECT.equals(action)) {
    			// 本人感觉 ACTION_MEDIA_EJECT 比
    			//  ACTION_MEDIA_UNMOUNTED 好
    			
    			// sd 卡不可用
    		} else if (Intent.ACTION_MEDIA_REMOVED.equals(action)) {
    			// sd 卡已经被移除卡槽
    		} else if (Intent.ACTION_MEDIA_SHARED.equals(action)) {
    			// 选择通过 usb 共享
    		} else if (Intent.ACTION_MEDIA_MOUNTED.equals(action)) {
    			// sd 卡可用
    		}
    	}

    但是这里提醒一下:


    接收到 ACTION_MEDIA_EJECT 广播之后,sd 卡还是可以读写的,

    直到接收到 ACTION_MEDIA_REMOVED、ACTION_MEDIA_UNMOUNTED等广播之后,sd 卡才不可以读写。

    可以借助 Music 源码 MediaPlaybackService.java 看看:


                    @Override
                    public void onReceive(Context context, Intent intent) {
                        String action = intent.getAction();
                        if (action.equals(Intent.ACTION_MEDIA_EJECT)) {
                            saveQueue(true);
                            mQueueIsSaveable = false;
                            closeExternalStorageFiles(intent.getData().getPath());
                        } else if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
                            mMediaMountedCount++;
                            mCardId = MusicUtils.getCardId(MediaPlaybackService.this);
                            reloadQueue();
                            mQueueIsSaveable = true;
                            notifyChange(QUEUE_CHANGED);
                            notifyChange(META_CHANGED);
                        }
                    }


    到这个时候,我们应该搞明白是系统哪个类发出这样的广播?有没有新的发现?


    android2.1/frameworks/base/services/java/com/android/server/MountService.java


    与其相关的类是


    android2.1/frameworks/base/services/java/com/android/server/MountListener.java


    继续跟踪 MountService.java , 我们会发现实例化 intent:


    intent = new Intent(Intent.ACTION_MEDIA_SHARED, Uri.parse("file://" + path));


    都包含一个 scheme 为 file 的 path,那麽这个 path 是什么呢?


    可以在 onReceive 方法里面得到这个值


    final String path = intent.getData().getPath()


    其实,就是 "/sdcard" (即 sd 卡路径)。


    这个信息很有用!!!


    比如你的手机可以外括除了 sd 卡的其它外部设备(如 u 盘、map 卡)

    那麽这个返回的路径就不一样,可以根据返回的路径判断你当前操作的是哪个设备了!


    耶耶,酷比嘞!


    在 MountService.java 里面还有一个与众不同的地方:


    void notifyMediaMounted(String path, boolean readOnly) {
            setMediaStorageNotification(0, 0, 0, false, false, null);
            updateUsbMassStorageNotification(false, false);
            Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, 
                    Uri.parse("file://" + path));
            intent.putExtra("read-only", readOnly);
            mMounted = true;
            mContext.sendBroadcast(intent);
    }


     intent.putExtra("read-only", readOnly)


    其中 readOnly 是一个 boolean 值,在 onReceive 里面 只有 action 是 ACTION_MEDIA_MOUNTED,接收到该值是 false.





    ------------- 附录 


    PlayerService.java


    package mark.zhang;
    
    import android.app.Service;
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.IBinder;
    import android.util.Log;
    
    public class PlayerService extends Service {
    	private static final String TAG = "PlayerService";
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		registerReceivers();
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	@Override
    	public void onDestroy() {
    		Log.d(TAG, "onDestroy------");
    		super.onDestroy();
    		unregisterReceivers();
    	}
    
    	private BroadcastReceiver externalStorageReceiver = null;
    
    	/**
    	 * 注册广播
    	 */
    	private void registerReceivers() {
    		if (externalStorageReceiver == null) {
    			externalStorageReceiver = new BroadcastReceiver() {
    
    				@Override
    				public void onReceive(Context context, Intent intent) {
    					final String action = intent.getAction();
    					final String path = intent.getData().getPath();
    					Log.d(TAG, "receive action = " + action);
    					boolean value = intent.getBooleanExtra("read-only", true);
    					Log.d(TAG, "external storage path = " + path);
    					Log.d(TAG, "external storage value = " + value);
    				}
    			};
    
    			final IntentFilter filter = new IntentFilter();
    			filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
    			filter.addAction(Intent.ACTION_MEDIA_BUTTON);
    			filter.addAction(Intent.ACTION_MEDIA_CHECKING);
    			filter.addAction(Intent.ACTION_MEDIA_EJECT);
    			filter.addAction(Intent.ACTION_MEDIA_MOUNTED);
    			filter.addAction(Intent.ACTION_MEDIA_NOFS);
    			filter.addAction(Intent.ACTION_MEDIA_REMOVED);
    			filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
    			filter.addAction(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    			filter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
    			filter.addAction(Intent.ACTION_MEDIA_SHARED);
    			filter.addAction(Intent.ACTION_MEDIA_UNMOUNTABLE);
    			filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
    			// 必须添加,否则无法接收到广播
    			filter.addDataScheme("file");
    
    			registerReceiver(externalStorageReceiver, filter);
    		}
    	}
    
    	/**
    	 * 取消注册
    	 */
    	private void unregisterReceivers() {
    		if (externalStorageReceiver != null) {
    			unregisterReceiver(externalStorageReceiver);
    			externalStorageReceiver = null;
    		}
    	}
    
    }
    









    展开全文
  • Arduino(2) Mega2560和外部设备串口通信

    千次阅读 2019-07-10 16:02:53
    其中Arduino硬件集成了串口、IIC、SPI三种常见的通信方式,可以与具有相应通信接口的各种设备通信。这章先介绍一下串口通信。 参考:CSDN博客 【STM32】串口通信基本原理(超基础、详细版)—— Yngz_Miao 硬件...

    前言

    Arduino开发板因为搭载的I/O资源较少,所以通常会采用串行通信方式。其中Arduino硬件集成了串口、IIC、SPI三种常见的通信方式,可以与具有相应通信接口的各种设备通信。这一章先介绍一下串口通信。
    参考:CSDN博客 【STM32】串口通信基本原理(超基础、详细版)—— Yngz_Miao

    硬件串口通信

    • 串口也被称为UART(Universal Asynchronous Receiver Transmitter,通用异步串行收发器)接口。两个设备在进行串口通信时,需要交叉相连发送端(TxD)和接收端(RxD),共用电源地线(GND),这也意味着通常一个串口只能连接一个设备进行通信。
      在这里插入图片描述
    • Arduino Mega2560开发板可以使用USB接口与电脑相连,使用的是默认的Serial串口,同时这块开发板还集成了额外的三个串口,TX和RX脚定义成从14脚起至19脚,也就是Mega2560作为下位机控制板除了和电脑上位机串口通信之外,还可以再和三个外部设备进行串口通信。
    • 硬件串口通信是指直接利用Arduino开发板上集成好的串口来进行通信,使用到了Arduino核心库里的HardwareSerial类,并且是默认被包含,无需include调用。它主要使用到的一些函数如下所示:
    1. Serial.available()

    获取到串口缓冲区接收到的字节数,最多可保存64Bytes

    2. Serial.begin(speed)

    初始化串口,可配置串口的各项参数。speed:波特率

    3. Serial.find(target)

    从串口缓冲区读取数据,直至读到指定的字符串。target:需要搜寻的字符串或字符

    4. Serial.flush()

    等待正在发送的数据发送完成。早期版本里可用来清空接收缓冲区。

    5. Serial.peek()

    返回一字节的数据,但不会从接收缓冲区删除该数据

    6. Serial.print(val, format)

    将数据以ASCII码形式输出。val:需要输出的数据 format:数据输出的格式

    7. Serial.read()

    从串口读取数据,每读取一个字节,就会从接收缓冲区移除一字节的数据。

    8. Serial.readBytes(buffer, length)

    从接收缓冲区读取指定长度的字符,并将其存入一个数组。buffer:用于存储数据的数组(char[]或者byte[]) length:需要读取的字符长度

    9. Serial.write(val)

    输出数据到串口,以字节形式。val:发送的数据

    串口接收数据的两种方法

    • 第一种方法可以接收任意大小的数据,使用Arduino自带的串口监视器来发送字符串,输入任意字符后,可以在滚动框里看到刚才输入的数据。
    void setup()
    {
    	Serial.begin(9600);    //初始化与电脑通信的串口
    }
    
    void loop()
    {
    	String rxdata="";
    	while(Serial.available()>0)
    	{
    		char inchar = Serial.read();  
    		rxdata+=(char)inchar;          //逐个字符接收串口缓冲区内的数据
    		delay(10);                     //等待数据完全进入串口缓冲区
    	}
    	if(rxdata!="")                     //如果接收到数据,就将其打印出来
    	{ 
    		Serial.print("Input: ");
    		Serial.println(rxdata);
    	}
    }
    

    在这里插入图片描述

    • 第二种方法使用Serial.readBytes()函数来接收输入的数据,这种方式就必须提前知道输入数据的大小,适合于接收一些特定传感器或者模块返回的数据。
    const int Length = 11;
    byte rxData[Length];   //提前申明一个用来存储数据的byte数组
    
    void setup() 
    {
        Serial.begin(9600);  
    }
    
    void loop() 
    {
        delay(20);
        int rxLength = Serial.available();
        if(rxLength > 0)                //当串口缓冲区内有数据进入时
        {
            if (rxLength == Length)     //验证所需的数据是否完全进入串口缓冲区
            {
                Serial.readBytes(rxData, Length);   //用提前申明的数组来接收数据
    			Serial.write(rxData, Length);       //打印数组内的数据
            }
        }
    }
    
    

    在这里插入图片描述

    软件模拟串口通信

    • Arduino还提供了SoftwareSerial类库,可将其他数字引脚通过程序来模拟成串口通信引脚。这样以来,开发板上集成的串口可称为硬件串口,使用SoftwareSerial类库模拟成的串口称为软串口。当然这样也有相应的局限性,波特率越高越不稳定,而且软串口是通过AVR芯片的PCINT中断功能来实现,所以不是所有的引脚都可以设置成软串口,Mega2560支持的引脚有10-13,50-53
    • SoftwareSerial类库不属于Arduino核心库,所以使用之前需要申明包含SoftwareSeria.h头文件,其中定义的成员函数也与硬串口类似,available()、begin()、read()、write()、print()等函数用法也相同,下面是几个不同于硬串口的成员函数。
    1. SoftwareSerial mySerial(rxPin, txPin)

    这个函数是SoftwareSerial类的构造函数,通过它可以指定软串口的RX和TX引脚。
    mySerial:用户自定义的软串口对象 rxPin:软串口接收引脚 txPin:软串口发送引脚

    2. mySerial.listen()

    开启软串口监听状态,Arduino在同一时间仅能监听一个软串口,所以当需要监听某个软串口时,就需要该对象调用此函数开启监听功能

    3. mySerial.overflow()

    检测缓冲区是否已经溢出,软串口缓冲区同硬件串口缓冲区一样,最多可保存64Bytes的数据

    展开全文
  • 内部网关协议到底属于哪一

    千次阅读 2020-02-16 12:38:50
    首先内部网关协议包括:RIP,OSPF。外部网关协议包括BGP。...一个协议的实现需要依赖协议所在层次的下一层功能。简单的说就是,如果TCP需要依赖网际层协议IP,那么它就是传输层的协议,但是笔者认为它能算是应用...
  • 它们可以可以称为电子产品,但不属于嵌入式。普通电子产品和嵌入式设备可以通过“是否带可编程的控制芯片”来进行区分。) 但对于电脑和手机是否属于嵌入式设备,网上的讨论比较多,说法比较多,疑惑也比较多。这篇...
  • unity使用外部的摄像头

    千次阅读 2018-12-11 15:49:27
    1.WebCamTexture  首先了解下WebCamTexture这个类,通过调用个...由于此过程是一个异步方法,所以调用的时候我们采用协程的方法来实现。 有了以上的信息,就可以让unity调用外部的摄像头了。 public class Te...
  • Kubernetes中的PodIP、ClusterIP和外部IP

    万次阅读 2018-01-23 16:31:57
    Kubernetes是Google开源的容器集群管理系统,是Docker容器的主要集群管理系统之。 其中,Kubernetes中管理主要有三种类型的IP:Pod IP 、Cluster IP 和 外部IP。 Pod IP Kubernetes的最小部署单元是Pod。利用...
  • 最近开发中遇到了一个问题,我使用Dockerfile生成web应用的镜像,在docker容器中运行,测试时发现在外部客户端发起http请求后,cURL返回了错误,error buffer是:Empty reply from server。(本来在本地测一直都是...
  • 细说Android的内部存储和外部存储

    千次阅读 2019-02-19 21:32:06
    无论种存储,都会涉及到手机的存储空间,而其中比较绕人的就是Android手机的内部存储和外部存储了,这两天花了点时间总结了一番,这里写成博客权当记录。 内部存储 概念:注意内部存储不是内存,它是手机中的...
  • ESP32支持扩展外部RAM,其实乐鑫已经在其ESP32 WROVER系列模组中集成了一个4M大小的外部PSRAM。 乐鑫对于ESP32 WROVER的介绍也是: ESP32-WROVER 系列模组基于 ESP32-D0WD 双核芯片设计,其强大的双核性能适用于对...
  • 外部中断和内部中断详解

    千次阅读 2017-09-06 17:59:40
    一个经理正处理文件时,电话铃响了(中断请求),不得在文件上做一个记号(返回地址),暂停工作,去接电话(中断),并指示“按第二方案办”(调中断服务程序),然后,再静下心来(恢复中断前状态),接着处理...
  • 解析Android内部存储、外部存储的区别

    万次阅读 多人点赞 2018-03-26 11:06:12
    1、背景 ...这知识点本人也重复看过好几次,但每次看完,过段时间就会忘记,于是打算对这知识点做总结,也可当成学习笔记分享给大家。 主要分为下面两点进行分析: Android设备文件系统的目...
  • 、内嵌样式——直接在页面的标签里加 solid;">测试信息 二、内部样式表——在head部分加入  type="text/css">div{margin: 0;padding: 0;border:1px red solid;} 三、链入外部样式表—
  • 在邱郁惠的《系统分析师UML用例实战》的第47页有一个例子:购物网站中有一个用例“刷卡结账”,它有一个被动的Actor,是“信用卡系统”。青润 21:59:21呵呵,邱的做法也是错误的。我看过她的那本书,里面在这方面,
  • 很多时候我们开发的软件需要对处理后的数据进行存储,以供再次访问。Android为数据存储提供了如下几种方式: 1、文件 2、SharedPreferences(偏好....文件 A.存储到android自带的存储空间中 文件存储数据使用了
  • 在新公司碰到的第一个网络问题竟然是关于重定向路由的,这个常被关注的问题竟然花费了我整整一下午时间来整理,本文介绍Linux协议栈是如何对待重定向路由的。路由项的生成方式任何具备网络功能的设备在内部都有有...
  • 排序算法之归并排序和外部排序

    千次阅读 2018-06-11 09:29:12
    、归并排序   归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的...
  • 我们知道,kubernetes的Cluster Network属于私有网络,只能在cluster Network内部才能访问部署的应用,那如何才能将Kubernetes集群中的应用暴露到外部网络,为外部用户提供服务呢?本文探讨了从外部网络访问...
  • TUN/TAP设备浅析() -- 原理浅析

    万次阅读 2017-06-12 21:34:56
    TUN 模拟的是一个二层设备,也就是说,通过它可以处理来自网络层的数据,更通俗一点的说,通过它,我们可以处理 IP 数据包。先来看看物理设备是如何工作的:上图中的 eth0 表示我们主机已有的真实的网卡接口 ...
  • S3C6410中断以及外部中断

    千次阅读 2011-12-12 15:27:57
    6410的中断系统: 嵌入式软件里的中断处理...而且在物理上CPU分离的芯片产生的中断,称为外部中断,外部中断可以联接不同的中断脚上,因此需要对中断IO进行较复杂的配置。    轮询模式是否一无是处?轮询的优
  • GUID只是为了标志你安装的设备属于一个什么类当中,这个类可以显示再设备管理器中。比如:你可以定义一个类,当然这个类有与系统中任何类都不同的GUID,然后选择一个图标和类名,就可以同网卡等其他设备一起显示在...
  • STM32芯片--FSMC外设扩展外部SRAM

    千次阅读 2019-10-13 09:22:26
    这里写自定义目录标题为什么要扩展...有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建...
  • Qt技巧:QProcess与外部程序的调用

    千次阅读 2015-09-07 21:03:43
    Qt中调用外部应用程序
  • Android 外部存储权限分析

    万次阅读 多人点赞 2014-05-24 19:56:26
    知道你有么有发现,KitKat之后的版本不再支持用户对外置SDcard(Secondary Storage)的写入等操作。如果用户想要 将文件等copy到手机中,则只能存储到内部存储器中,而无法存储到外置sdcard中,而且无法创建新的...
  • 设备文件

    千次阅读 2014-03-10 14:08:10
    linux 操作系统秉承“一切都是...理解块设备文件,关键有两方面,一,从外部表现看,他是属于某个外部文件系统上的一个文件,通常将他们存放在/dev目录下,用户像常规文件一样通过文件名对他们进行访问;二,从内部实现
  • PCIe实践之路:设备枚举

    万次阅读 2017-07-08 22:46:17
    人的一生是一个不断认识自我,发展自我的过程。 认识PCIe设备的枚举过程需要以下知识: 拓扑结构 设备的表征及配置空间的访问 BAR空间的含义和访问 其中第1/2点在总线结构与配置空间已经介绍过了,第3点在BAR空间和...
  • linux设备驱动模型架构分析

    千次阅读 2018-07-04 15:14:49
    概述LDD3中说:“Linux内核需要一个对系统结构的一般性描述。”这个描述就是linux设备驱动模型(下面简称为LDDM)。LDDM不是独立存在,其体系如下图所示:对架构的每一部分本文都会开辟独立的章节进行描述。暂且抛开...
  • 彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑 1、Android中内部存储,外部存储的概念 2、清除数据和清除缓存到底清除了什么数据 3、/storage/sdcard,/sdcard,/mnt/sdcard,/storage/...
  • 导读:之前推荐过篇等级保护安全设备配置方案,那么,这些安全设备都是什么样的设备呢?有什么功能?如何部署?给大家推荐这篇安全设备知识点汇总。   网络安全等级保护网络设备、安全设备知识点汇总 本文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 106,873
精华内容 42,749
关键字:

哪一个不属于外部设备