精华内容
下载资源
问答
  • 对于进程,多数关注重点是在于 两个进程之间的通信,其实也存在同步的机制包含在"通信"里面,只是不同进程拥有独立地址空间,互不干涉,所以重点在于怎样让连个进程进行数据往来交流。 而线程,属于同一个...

    (以下纯属个人见解)
    对于进程,多数的关注重点是在于 两个进程之间的通信,其实也存在同步的机制包含在"通信"里面,只是不同的进程拥有独立的地址空间,互不干涉,所以重点在于怎样让连个进程进行数据往来交流。

    而线程,属于同一个进程创建的线程本来就是共享一些资源,所以讨论的侧重点也就不在于交流数据,而在于并发的时候怎么确保其和谐相处而不至于对一些公用的资源进行不合理的并发访问。这就是同步。

    但是对于Linux来讲,其内部的线程本质上还是进程,只是已经对其进行了一些资源共享的操作,所以某些用于进程间 “同步”的手段,也一样适用于线程。比如信号量。

    进程间通信
    (有这一个文章讲得很是详细)
    简单地列举下:
           1.0 管道(Pipe):及有名管道 (坦白来说,实际开发用的还真没见过)
           2.0 信号(Signal):类似于通知消息的机制。
           3.0 消息队列(Message): 这是个队列,比单纯的信号能存储更多的信号。
           4.0 共享内存:() 效率最高的一种通信方式。也是常用的一个
           5.0 信号量:(semaphore),主要是个同步手段,所以也用于线程之间的同步。典型的生产者消费者问题。
           6.0 套接口(Socket),本是为不同的主机之间的进程之间进行通信的,也可以用于本地机器的不同进程之间通信。


    线程间同步
    1.0 互斥锁
    2.0 条件等待 :通常需要配合一个互斥锁一起使用。(使用场景后续)   pthread_cond_wait()函数一进入wait状态就会自动           release mutex,所以调用前先自行加锁。
    3.0 信号量 :
         注意一个信号量和条件等待的细微区别:(个人见解)

         条件等待:pthread_cond_signal ()发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态。

     

          信号量,可以说是一个实际的物件,记住生产者消费者模式就可以很好地理解,但是条件等待,就不一样了,可以说条件等待是一个动态的 ”机遇“, 机遇稍纵即逝,pthread_cond_signal()产生一个条件,如果这个时候没有线程来把握住这个机会,pthread_cond_signal()返回,这个机会就没有了,条件就不成熟了。所以,你要先提前在这里“等待”。

    比如这样的一个场景

    void *ThreadBody(void * data)     
    {       
          while(1)
          {
    	pthread_mutex_lock(&p_sys->cmd_lock);
    	do
    	{
    	  pthread_cond_wait(&cmd_wait, &cmd_lock);
              printf("hello world!\n");
    	}while(0);
    	pthread_mutex_unlock(&cmd_lock);
          }
    		
    }
    	if(pthread_create( *, ThreadBody,NULL,NULL)
            {
                   ....
            }	
    		
            //usleep(1000);
            pthread_mutex_lock(&cmd_lock);
    	do
    	{
               pthread_cond_signal(&md_wait);
    	}while(0);
    	pthread_mutex_unlock(&cmd_lock);

    本意是想创建一个线程,线程里面要条件等待,在创建完线程之后马上产生一个条件变量,然后线程就可以执行一次。而实际结果可能是,在pthread_cond_signal调用的时候,上面创建的线程创建虽然成功,但是还没被系统调度起来,等线程调度起来这个pthread_cond_signal已经返回了,线程没有等到这个条件。。。。加上上面的usleep确保线程优先被调度起来,可以。如果换成信号量,也不会出现这个问题。

     

    概念如上,附上使用demo,方便查阅:

    2.0 信号:

           一般老的接口是使用signal()函数,新的函数为 sigaction 区别:https://www.cnblogs.com/chllovegeyuting/archive/2012/09/10/2679178.html 一般使用sigaction()函数注册信号处理函数

    信号量值,在Linux系统中 #kill -l 命令可以大概列出:

    01 SIGHUP 挂起(hangup)
    02 SIGINT 中断,当用户从键盘按^c键或^break键时
    03 SIGQUIT 退出,当用户从键盘按quit键时
    04 SIGILL 非法指令
    05 SIGTRAP 跟踪陷阱(trace trap),启动进程,跟踪代码的执行
    06 SIGIOT IOT指令
    07 SIGEMT EMT指令
    08 SIGFPE 浮点运算溢出
    09 SIGKILL 杀死、终止进程 
    10 SIGBUS 总线错误
    11 SIGSEGV 段违例(segmentation  violation),进程试图去访问其虚地址空间以外的位置
    12 SIGSYS 系统调用中参数错,如系统调用号非法
    13 SIGPIPE 向某个非读管道中写入数据
    14 SIGALRM 闹钟。当某进程希望在某时间后接收信号时发此信号
    15 SIGTERM 软件终止(software  termination)
    16 SIGUSR1 用户自定义信号1
    17 SIGUSR2 用户自定义信号2
    18 SIGCLD 某个子进程死
    19 SIGPWR 电源故障
    
    kill -l
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
     6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
    11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
    16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
    21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
    26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
    31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
    38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
    43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
    48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
    53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
    58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
    63) SIGRTMAX-1	64) SIGRTMAX	

     使用实例

    #include<stdio.h>
    #include <signal.h>
    #include <sys/time.h> //for setitimer()
    
    #include <unistd.h> //for sleep()
    
    #include <sys/types.h> //for kill()
    //#include <signal.h>
    
    
    // #include <sys/types.h> //for getpid()
    // #include <unistd.h>
    
    int count  =100;
    
    void fun_alarm(int sigNum)
    {
    	printf("get signal %d count %d[%d%s]\n",sigNum,count,__LINE__,__FUNCTION__);
    }
    int main()
    {
    	struct sigaction SigAction;
    	SigAction.sa_handler = fun_alarm;
    	SigAction.sa_flags = 0;
    	sigemptyset(&SigAction.sa_mask);//clear 
    	sigaction(SIGALRM,&SigAction,NULL);
    	
    
    	//case 1:  timer
    	struct itimerval iTimer;
    	iTimer.it_value.tv_sec = 3;//这个 int_value 是定时器的初始值
    	iTimer.it_value.tv_usec = 0;
    	iTimer.it_interval.tv_sec = 5;//定时器开始运行后,将从初始值往下减,当时间消耗完,用这个新值来重新设置,如果这个设为0,那么定时器只会运行一次
    	iTimer.it_interval.tv_usec = 0;
    	setitimer(ITIMER_REAL,&iTimer,NULL);//第三个参数,表示定时器多久之后开始运行,给NULL,立即开始 。定时器到时见产生一个 SIGALRM信号。
    
    	while(count--)
    	{
    		sleep(1);
    		if(95 == count)
    		{//case 2: code self send signal
    			printf("case 2: code kill send signal![%d%s]\n",__LINE__,__FUNCTION__);
    			kill(getpid(),SIGALRM);
    		}
    	}
    
    	//case 3: kill -14 pid //在外部 用kill -14 pid 给进程发送 信号 14
    
    }
    

    3.0 消息队列

    4.0 共享内存

    5.0 信号量

    运行结果:
    root@ubuntu:/mnt/hgfs/share/test# ./a.out
    P: --[13thread2]
    V: ++[33main]
    P: --[13thread2]
    V: ++[33main]
    P: --[13thread2]
    V: ++[33main]
    P: --[13thread2]
    V: ++[33main]
    P: --[13thread2]
    V: ++[33main]
    P: --[13thread2]
    V: ++[33main]
    P: --[13thread2]
    ^C
    root@ubuntu:/mnt/hgfs/share/test# vi lock_test.c
    root@ubuntu:/mnt/hgfs/share/test# cat lock_test.c 
    代码:
    #include<stdio.h>
    #include <pthread.h>
    #include <unistd.h>
    
    #include <semaphore.h>
    
    sem_t sem;
    void *thread2(void *data)
    {
    	while(1)
    	{
    	 	sem_wait(&sem);
    		printf("P: --[%d%s]\n",__LINE__,__FUNCTION__);
    	}
    
    }
    
    pthread_t pid_pthread;
    
    int main()
    {
    	sem_init(&sem,0,1);//第二个参数为 0 ,表示只在同一个进程下的线程间可用,非0表示不同的进程间可用
    	if(pthread_create(&pid_pthread,NULL,thread2,NULL))
    	{
    		printf("thread create erro!\n");
    		return -1;
    	}
    	pthread_detach(pid_pthread);
    
    	while(1)
    	{
    		sleep(1);
    		printf("V: ++[%d%s]\n",__LINE__,__FUNCTION__);
    		sem_post(&sem);
    		//sem_getvalue(sem_t *sem, int *sval);//可以获取信号量的值
    	}
    
    	sem_destroy(&sem);
    
    }
    

    6.0 互斥锁 :上述情景实例

           互斥锁的初始化有两种 方式:

            6.1 动态初始化:

                    pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr)

                    一般第二个参数,互斥锁属性 传NULL,表示默认属性

             6.2 静态初始化:

                     定义pthread_mutex_t变量的时候就给初始值,静态初始化

                    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

               6.3 互斥锁使用的时候,还有一种非阻塞方式,trylock,如果锁不可用,则不阻塞直接返回。

                         int pthread_mutex_trylock(pthread_mutex_t *mutex)

    7.0 条件等待:上述情景实例

     

    展开全文
  • 嵌入式那些通信协议

    千次阅读 2019-06-14 20:08:13
    区别于UART,UART是通用异步收发传输器,USART属于UART增强型,在异步传输时没有啥区别,但是USART比UART多了同步传输功能,他可以为通信设备提供主动时钟。(由于通常都是使用异步传输,UART与USART就没有啥区别...

    1.USART

    通用同步/异步串行接收/发送器,USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。

    区别于UART,UART是通用异步收发传输器,USART属于UART的增强型,在异步传输时没有啥区别,但是USART比UART多了同步传输功能,他可以为通信设备提供主动时钟。(由于通常都是使用异步传输,UART与USART就没有啥区别,所以以下USART与UART不做区分,都为UART)

    ps:USART应该是我们嵌入式童鞋在平常单片机开发中用到最多的一种通信协议了吧。

    这个界面有熟悉的童鞋吗

    工作原理:

    UART使用4线(VCC, GND, RX, TX)

    UART使用标准的TTL/CMOS逻辑电平(0~5v、0~3.3v、0~2.5v或0~1.8v)来表示数据,高电平表示1,低电平表示0。为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOD逻辑电平转换为RS-232逻辑电平,3~12v表示0,-3~-12v表示1

    UART的帧格式包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、1.5、2位)。

    UART帧格式

    数据在传输过程中是通过一位一位地进行传输来实现通信的,每一次的传输都是靠起始位来同步,空闲时为高电平,用下降沿来通知接收方准备接收,紧接着的就是数据位根据设置的5/6/7/8位数据来进行传输,低位在前,高位在后(LSB——MSB),数据位结束后就是奇偶校验为,校验位之后就是停止位,停止位是用高电平来标记一个字符的结束,并为下一个字符的传输做准备。停止位后面是不同长度的空闲位。停止位和空闲位都规定为高电平,这样可以保证起始位有一个下降沿。

    特点:

        全双工传输

        使用方便,协议相对较简单

    缺点:

        需要转换为232电平才适合长距离传输


    2.RS232

    由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现。

    工作原理:

    大致上与UART相同

    RS-232串口通信最远距离是50英尺;

    RS232可做到双向传输,全双工通讯,最高传输速率20kbps。

    RS-232上传送的数字量采用负逻辑,且与地对称。逻辑1:-3 ~-15V    逻辑0:+3~+15V。

    RS-232-C标准规定的数据传输速率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。

    9芯引脚对应图

    特点:

    协议采用的电压较高,容易损坏接口芯片。与TTL电平不兼容,所以必须加电平转换芯片(例如max232)才能和TTL进行通信

    传输速率较低,在异步传输时,比特率为20Kbps

    接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

    传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右


    3.RS485

    RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。

    RS485是一个定义平衡数字多点系统中的驱动器和接收器的电气特性的标准,该标准由电信行业协会和电子工业联盟定义。使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。RS-485使得廉价本地网络以及多支路通信链路的配置成为可能。

    RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接32个节点。

    在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。

    很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来,而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,原因1是共模干扰:RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了,但容易忽视了收发器有一定的共模电压范围,RS-485收发器共模电压范围为-7到+12V,只有满足上述条件,整个网络才能正常工作;当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口;原因二是EMI的问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。

    485引脚功能图

    RS-485的电气特性:逻辑“1”以两线间的电压差+2V~+6V表示,逻辑“0”以两线间的电压差-6V~-2V表示。接口信号电平比RS-232-C降低了,就不容易损坏接口电路芯片,且该电平与TTL电平兼容,刻方便与TTL电路连接。

    数据最高传输速率为:10Mbps

    RS-485接口采用平衡驱动器和差分接收器的组合,抗共模干扰能力强,即抗噪声性能好。

    RS-485接口的最大传输距离标准值4000英尺,实际上可达3000米。

    RS-232-C接口在总线上只允许连接一个收发器,即单站能力;而RS-485接口在总线上只允许连接多达128个收发器,即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立设备网络。


    4.RS422

            EIA-422(过去称为RS-422)是一系列的规定采用4线,全双工,差分传输,多点通信的数据传输协议,它定义了接口电路的特性。它采用平衡传输采用单向/非可逆,有使能端或没有使能端的传输线。和RS-485不同的是EIA-422不允许出现多个发送端而只能有多个接受端。硬件构成上EIA-422 (RS-422)相当于两组EIA-485(RS-485),即两个半双工的EIA-485(RS-485)构成一个全双工的EIA-422(RS-422)。一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10x4k+100Ω(终接电阻)。

      RS-422和RS-485电路原理基本相同,都是以差动方式发送和接受,不需要数字地线。差动工作是同速率条件下传输距离远的根本原因,这正是二者与RS232的根本区别,因为RS232是单端输入输出,双工工作时至少需要数字地线。发送线和接受线三条线(异步传输),还可以加其它控制线完成同步等功能。

      RS-422通过两对双绞线可以全双工工作收发互不影响,而RS485只能半双工工作,发收不能同时进行,但它只需要一对双绞线。RS422和RS485在19kpbs下能传输1200米。用新型收发器线路上可连接台设备。

      RS-422的电气性能与RS-485完全一样。主要的区别在于:RS-422有4根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422的收与发是分开的所以可以同时收和发(全双工);RS-485有2根信号线:发送和接收。

    特性:

            RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

      RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在短距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。

    RS232/RS485/RS422区别

    RS232是全双工的,RS485是半双工的,RS422是全双工的。

    RS485与RS232仅仅是通讯的物理协议(即接口标准)有区别,RS485是差分传输方式,RS232是单端传输方式,但通讯程序没有太多的差别。

    都被称为串口通信


    5.IIC

    IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。

    I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

        开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

        结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

        应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。

    CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

    这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要

    多主机I2C总线系统结构

    总线时序图

    空闲状态:I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

    起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。

    停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

     

    起始信号与停止信号

    应答信号:发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

    数据有效性:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。即:数据在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。

     

    数据的传送:在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。


    6.SPI

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议

    SPI接口一般使用4条线通信:

    MISO 主设备数据输入,从设备数据输出。

    MOSI 主设备数据输出,从设备数据输入。

    SCLK时钟信号,由主设备产生。

    CS从设备片选信号,由主设备控制。

    从图中可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

    SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

    SPI总线四种工作方式SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

    展开全文
  • 移动通信属于无线通信,但其实际为无线与有线结合体。移动业务交换中心(MSC)与基站控制器(BSC)之间A接口以及基站控制器(BSC)与基站收发信台(BTS)之间ABIS接口其物理连接均为采用标准2.048MB/S...
  • 总结:嵌入式那些通信协议

    千次阅读 2019-03-15 22:45:59
    区别于UART,UART是通用异步收发传输器,USART属于UART增强型,在异步传输时没有啥区别,但是USART比UART多了同步传输功能,他可以为通信设备提供主动时钟。(由于通常都是使用异步传输,UART与USART就没有啥区别...

    1.USART

    通用同步/异步串行接收/发送器,USART是一个全双工通用同步/异步串行收发模块,该接口是一个高度灵活的串行通信设备。

    区别于UART,UART是通用异步收发传输器,USART属于UART的增强型,在异步传输时没有啥区别,但是USART比UART多了同步传输功能,他可以为通信设备提供主动时钟。(由于通常都是使用异步传输,UART与USART就没有啥区别,所以以下USART与UART不做区分,都为UART)

    ps:USART应该是我们嵌入式童鞋在平常单片机开发中用到最多的一种通信协议了吧。

    这个界面有熟悉的童鞋吗

    工作原理:

    UART使用4线(VCC, GND, RX, TX)

    UART使用标准的TTL/CMOS逻辑电平(0~5v、0~3.3v、0~2.5v或0~1.8v)来表示数据,高电平表示1,低电平表示0。为了增强数据的抗干扰能力、提高传输长度,通常将TTL/CMOD逻辑电平转换为RS-232逻辑电平,3~12v表示0,-3~-12v表示1

    UART的帧格式包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、5~8位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、1.5、2位)。

    UART帧格式

    数据在传输过程中是通过一位一位地进行传输来实现通信的,每一次的传输都是靠起始位来同步,空闲时为高电平,用下降沿来通知接收方准备接收,紧接着的就是数据位根据设置的5/6/7/8位数据来进行传输,低位在前,高位在后(LSB——MSB),数据位结束后就是奇偶校验为,校验位之后就是停止位,停止位是用高电平来标记一个字符的结束,并为下一个字符的传输做准备。停止位后面是不同长度的空闲位。停止位和空闲位都规定为高电平,这样可以保证起始位有一个下降沿。

    特点:

        全双工传输

        使用方便,协议相对较简单

    缺点:

        需要转换为232电平才适合长距离传输

     


    2.RS232

    由电子工业协会(Electronic Industries Association,EIA) 所制定的异步传输标准接口。通常 RS-232 接口以9个引脚 (DB-9) 或是25个引脚 (DB-25) 的型态出现。

    工作原理:

    大致上与UART相同

    RS-232串口通信最远距离是50英尺;

    RS232可做到双向传输,全双工通讯,最高传输速率20kbps 3

    RS-232上传送的数字量采用负逻辑,且与地对称 逻辑1:-3 ~-15V    逻辑0:+3~+15V。

    RS-232-C标准规定的数据传输速率为50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。

    9芯引脚对应图

    特点:

    协议采用的电压较高,容易损坏接口芯片。与TTL电平不兼容,所以必须加电平转换芯片(例如max232)才能和TTL进行通信

    传输速率较低,在异步传输时,比特率为20Kbps

    接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

    传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在15米左右

     


    3.RS485

    RS-485又名TIA-485-A, ANSI/TIA/EIA-485或TIA/EIA-485。

    RS485是一个定义平衡数字多点系统中的驱动器和接收器的电气特性的标准,该标准由电信行业协会和电子工业联盟定义。使用该标准的数字通信网络能在远距离条件下以及电子噪声大的环境下有效传输信号。RS-485使得廉价本地网络以及多支路通信链路的配置成为可能。

    RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线式拓扑结构,在同一总线上最多可以挂接32个节点。

    在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。

    很多情况下,连接RS-485通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来,而忽略了信号地的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,原因1是共模干扰:RS-485接口采用差分方式传输信号方式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了,但容易忽视了收发器有一定的共模电压范围,RS-485收发器共模电压范围为-7到+12V,只有满足上述条件,整个网络才能正常工作;当网络线路中共模电压超出此范围时就会影响通信的稳定可靠,甚至损坏接口;原因二是EMI的问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。

    485引脚功能图

    RS-485的电气特性:逻辑“1”以两线间的电压差+2V~+6V表示,逻辑“0”以两线间的电压差-6V~-2V表示。接口信号电平比RS-232-C降低了,就不容易损坏接口电路芯片,且该电平与TTL电平兼容,刻方便与TTL电路连接。

    数据最高传输速率为:10Mbps

    RS-485接口采用平衡驱动器和差分接收器的组合,抗共模干扰能力强,即抗噪声性能好。

    RS-485接口的最大传输距离标准值4000英尺,实际上可达3000米。

    RS-232-C接口在总线上只允许连接一个收发器,即单站能力;而RS-485接口在总线上只允许连接多达128个收发器,即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立设备网络。

     


    4.RS422

            EIA-422(过去称为RS-422)是一系列的规定采用4线,全双工,差分传输,多点通信的数据传输协议,它定义了接口电路的特性。它采用平衡传输采用单向/非可逆,有使能端或没有使能端的传输线。和RS-485不同的是EIA-422不允许出现多个发送端而只能有多个接受端。硬件构成上EIA-422 (RS-422)相当于两组EIA-485(RS-485),即两个半双工的EIA-485(RS-485)构成一个全双工的EIA-422(RS-422)。一个主设备(Master),其余为从设备(Slave),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10&TImes;4k+100Ω(终接电阻)。

      RS-422和RS-485电路原理基本相同,都是以差动方式发送和接受,不需要数字地线。差动工作是同速率条件下传输距离远的根本原因,这正是二者与RS232的根本区别,因为RS232是单端输入输出,双工工作时至少需要数字地线。发送线和接受线三条线(异步传输),还可以加其它控制线完成同步等功能。

      RS-422通过两对双绞线可以全双工工作收发互不影响,而RS485只能半双工工作,发收不能同时进行,但它只需要一对双绞线。RS422和RS485在19kpbs下能传输1200米。用新型收发器线路上可连接台设备。

      RS-422的电气性能与RS-485完全一样。主要的区别在于:RS-422有4根信号线:两根发送(Y、Z)、两根接收(A、B)。由于RS-422的收与发是分开的所以可以同时收和发(全双工);RS-485有2根信号线:发送和接收。

     

    特性:

            RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。RS-422的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率仅为1Mb/s。

      RS-422需要一终接电阻,要求其阻值约等于传输电缆的特性阻抗。在短距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。

    RS232/RS485/RS422区别

    RS232是全双工的,RS485是半双工的,RS422是全双工的。

    RS485与RS232仅仅是通讯的物理协议(即接口标准)有区别,RS485是差分传输方式,RS232是单端传输方式,但通讯程序没有太多的差别。

    都被称为串口通信

     


    5.IIC

    IIC(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。

    I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。

        开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。

        结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

        应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。

    CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

    这些信号中,起始信号是必需的,结束信号和应答信号,都可以不要

     

    多主机I2C总线系统结构

    总线时序图

    空闲状态:I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

    起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。

    停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

     

    起始信号与停止信号

    应答信号:发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。 如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

    数据有效性:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。即:数据在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。

    数据的传送:在I2C总线上传送的每一位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。

     


    6.SPI

    SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX系列处理器上定义的。SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议

     

     

    SPI接口一般使用4条线通信:

    MISO 主设备数据输入,从设备数据输出。

    MOSI 主设备数据输出,从设备数据输入。

    SCLK时钟信号,由主设备产生。

    CS从设备片选信号,由主设备控制。

    从图中可以看出,主机和从机都有一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节来发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。这样,两个移位寄存器中的内容就被交换。外设的写操作和读操作是同步完成的。如果只进行写操作,主机只需忽略接收到的字节;反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。

    SPI主要特点有:可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。

    SPI总线四种工作方式SPI 模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI主模块和与之通信的外设备时钟相位和极性应该一致。

     

     


    总结还不够全面,后期陆续补充,欢迎大家指出错误或者提出建议。

    展开全文
  • 关于多线程间通信的

    2014-07-03 23:07:50
    如果一个进程中所有线程都不需要相互传递数据就可以顺利完成,那么程序运行性能自然是最好,但是实际上,很少有现成能够在所有时间都独立进行操作,通常在以下两种情况下,线程之间需要进行通信。...
    Windows线程间通信
    .
    1.概述
    如果一个进程中的所有线程都不需要相互传递数据就可以顺利完成,那么程序运行的性能自然是最好的,但是实际上,很少有现成能够在所有的时间都独立的进行操作,通常在以下两种情况下,线程之间需要进行通信。
    a) 多个线程都对共享资源资源进行访问,但不希望共享资源被破坏。
    b) 一个线程完成了任务,要通知其他的线程。
    情况a)属于互斥问题,情况b)属于同步问题。通常的解决方法如下:
    2.解决方法
    a) 互锁函数
    互锁函数是windows提供的一个函数族,它可以实现对共享变量的简单原子访问,所谓的原子访问就是说当当前线程正在访问资源时,可以保证其他的线程没有同时访问这个资源。但是它只能完成以原子操作方式修改单个值,作用域很小。
    Eg:
    Long g = 0;
    DWORD _stdcall TF1(PVOID p){
    g++;
    Return 0;
    }
    DWORD _stdcall TF2(PVOID p){
    g++;
    Return 0;
    }
    在上面的例子中,不能保证运行结束时g的值为2,因为在自加的过程中,线程可能会被另一个线程打断,这时,两个线程可能对同一个变量进行了操作,出现了错误,这是使用互锁函数改为即可保证在一个线程进行g++时,另一个线程不会将其打断。
    Long g = 0;
    DWORD _stdcall TF1(PVOID p){
    InterlockedExchangeAdd(&g, 1);
    Return 0;
    }
    DWORD _stdcall TF2(PVOID p){
    InterlockedExchangeAdd(&g, 1);
    Return 0;
    }
    类似的函数还有
    LONG InterlockedExchange(PLONG plTarget, LONG lValue);
    PVOID InterlockedCompareExchange(PLONG plDestination, LONG lExchange, LONG lComparand);
    b) 临界段
    临界段也叫做关键代码段,它是一小段代码,通过设置临界区域,能够以原子操作的方式使用资源。具有相同临界资源的临界段只能允许一个线程执行它,其他要进入该段的线程将被挂起,直到前面的线程释放临界资源。
    Win32 API中临界段的设置:
    首先定义一个全局临界对象,类型为CRITICAL_SECTION
    CRITICAL_SECTION cs;
    然后调用函数对其初始化:
    InitializeCriticalSection(&cs);
    这样就创建了一个名为cs的临界段对象了,然后对于可能会发生冲突的线程代码段使用同一个临界对象进行处理即可,进入临界段的代码为:
    EnterCriticalSection(&cs);
    此时,线程被认为拥有临界段对象,没有两个线程可以同时拥有相同的临界对象,因此,如果一个线程进入了临界段,那么下一个使用相同临界段对象调用EnterCriticalSection的线程将被挂起。离开临界段的函数为:
    LeaveCriticalSeciton(&cs);
    此时,释放临界对象的所有权,删除临界对象的函数为:
    DeleteCriticalSection(&cs);
    c) 使用内核对象进行线程通信
    互锁函数和临界段都是属于用户态的通信,好处是速度很快,但是对许多应用程序而言是不足的,而使用内核对象进行通信速度较慢,其他的性能较好。使用内核对象进行线程通信的机理是:很多内核对象存在一个属性,用来表示该内核对象是已通知状态还是未通知状态,然后通常使用WaitForSingleObject或WaitForMultipleObjects来等待特定内核对象的已通知状态。
    
    事件对象
    
    事件内核对象通常和WaitForSingleObject等联合使用,事件对象主要用于标志一个操作是否已经完成,其函数为:
    HANDLE CreateEvent(
    PSECURITY_ATTRIBUTES psa,
    BOOL fManualReset,
    BOOL fInitialState,
    PCTSTR pszName);
    第一个参数为安全属性,第二个参数用于设置创建一个人工重置事件(ture)还是自动重置事件,两者的区别在于:如果设置成人工重置事件,则需要使用SetEvent和ResetEvent函数来将事件设置成已通知事件和未通知事件,当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度的;如果设置成自动重置事件,当使用SetEvent设置事件的通知状态时,在等待事件的线程中,只有一个线程被回复(哪个不确定),之后系统自动将事件设为未通知状态。第三个参数用于设置事件初始状态,第四个参数用于设置事件的名字。
    
    互斥对象
    
    互斥量是一种内核对象,它能够确保线程拥有对单个资源的互斥访问权。它与临界段相同,但是互斥量属于内核对象,临界段属于用户对象,这意味着互斥要比临界段慢,但是不同进程中的多个线程能够访问单个互斥量。互斥量不同于所有其他的内核对象,互斥量中有一个线程ID,用于标志该互斥量属于哪个线程(即不论在哪个线程中创建了没有归属的互斥量,只要在某个线程中将互斥量变为未通知事件,那么这个线程就拥有这个互斥量,如果在该线程中释放了这个互斥量,那么该互斥量又变成游离状态,没有所属的线程,然后重复上面的过程),因此互斥量有一个“线程所有权”的概念,因此如果调用ReleaseMutex的线程不拥有互斥量,那么该函数不进行任何操作。
    Win32 API互斥量函数:
    创建一个互斥量:
    HANDLE CreateMutex(
    PSECURITY_ATTRIBUTES psa,
    BOOL fInitialOwner,
    PCTSTR pszName);
    第一个参数安全属性,最后一个参数为互斥量的名字,第二个参数:
    A) 如果设为FALSE,则表示没有线程拥有该互斥量,线程ID为0,处于已通知 状态。
    B) 如果设为TURE,则表示当前线程拥有该互斥,线程ID为当前线程的ID,处 于未通知状态。
    当某个拥有互斥的线程不想再拥有该互斥的时候,则调用函数:
    ReleaseMutex(HANDLE hMutex);
    来释放该线程对该互斥的占有,此后该互斥量又变成游离的状态,直到再出现一个 线程拥有它。
    
    信号量
    
    信号量也是一种内核对象,用于对资源进行计数。信号量的使用规则是:如果当前资源数量大于0,那么等待信号量的线程可以获得一个资源并继续执行,信号量的当前资源数将减1;如果当前资源数为0,那么等待信号量的线程将处于等待状态,直到有线程释放信号量,使当前资源数大于0,当前资源数不会超过最大资源数量值,也不会小于0。
    Win32用于创建和释放信号量的API函数
    HANDLE CreateSemaphore(
    PSECURITY_ATTRIBUTE psa,
    LONG lInitialCount,
    LONG lMaximumCount,
    PCTSTR pszName);
    BOOL ReleaseSemaphore(
    HANDLE hsem,
    LONG lReleaseCount,
    PLONG plPreviousCount);
    展开全文
  • 本发明属于高速数字电路技术领域,更具体地,涉及一种同源同步时钟电路。背景技术:在高速数字电路设计中,模块内时钟电路是处理器正常工作基础,其时钟稳定性、一致性直接影响处理器工作、通信接口数据交互等...
  • Netlink相对于其他通信机制具有以下优点: ... Netlink使用socket缓存队列,是一种异步通信机制,而ioctl是同步通信机制,如果传输数据量较大,会影响系统性能。 Netlink支持多播,属于一个...
  • Windows线程间通信

    2014-07-21 11:24:08
    如果一个进程中所有线程都不需要相互传递数据就可以顺利完成,那么程序运行性能自然是最好,但是实际上,很少有现成能够在所有时间都独立进行操作,通常在以下两种情况下,线程之间需要进行通信。...
  • Windows中线程间通信

    2014-03-05 00:56:46
    如果一个进程中所有线程都不需要相互传递数据就可以顺利完成,那么程序运行性能自然是最好,但是实际上,很少有现成能够在所有时间都独立进行操作,通常在以下两种情况下,线程之间需要进行通信。...
  • 以下描述同步数字传输体系STM-N帧结构的说法,正确的是( )。 (5.0分) A、 STM-4的传输速率是155Mb/s B、 帧频为8000帧/秒 C、 传输方向从左到右,从上到下 D、 帧结构由三部分组成,分别是段...
  • 的是电子计算机中常的“存贮程序控制”方式。它把名种控制功能、步骤、方法绵成程 序,放入存财器,通过运行存贮内所存贮的程序来控制整个交换工作 21.交换系统的基本功能有哪些? 连諓功能、信令功能、終端接口功能...
  • 这是受下述设计原则影响的自然结果:把应用程序设计为一组相互通信的小片断比将其设计为单个庞大的程 序更好。从历史角度看,应用程序有如下几种构建方法。  (1) 用一个庞大的程序完成全部工作。程序的各部分可以...
  • 这是受下述设计原则影响的自然结果:把应用程序设计为一组相互通信的小片断比将其设计为单个庞大的程序更好。从历史角度看,应用程序有如下几种构建方法。  (1) 用一个庞大的程序完成全部工作。程序的各部分可以...
  • 如果你遇到了以下描述情况,很可能是这个Bug导致: 客户端在断开上一个连接以后,开启下一个连接,新...使用TcpClient进行Socket连接以后,通过Read方法进行数据读取,Read方法属于同步操作,当缓冲区没有...
  • 然后研究了逆变器的同步控制策略,提高了同步控制精度;最后研究了逆变器分布式并联控制策略。设计完成了 1 台基于 DSP 1KVA UPS 原理样机,给出了硬件电路和软件程序设计方法,并以此样机为平台进行了相关...
  • 为什么Wait和notify方法在Object中?

    千次阅读 2020-11-27 09:05:28
    wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。 对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象...
  • 百草枯项目-源码

    2021-02-17 06:36:43
    百草枯项目 医疗错误很难被发现和解决,尤其是在医院医生在压力下工作时,例如在急诊室。... 该系统使用HTTP协议进行同步通信,使用AMQP进行异步通信,这对于在微服务体系结构中创建松耦合服务非常有
  • 本文属于研究进程和线程入门级文章。 主要从以下五个方面介绍进程以及线程相关概念。 进程和线程定义 操作系统中对进程和线程描述 进程多层调度 进程/线程之间的同步机制 进程/线程之间的通信机制 如何...
  • 很强ccna教程

    2013-12-02 15:02:54
    可路由协议( Routed Protocol) :利用网络层完成通信的协议,允许数据包从一个主机主机一寻址方案转发到另一主机。例如;IP;IPX; 路由协议 (Routing Protocol):本质是创建和维护路由表,可路由协议利用他实现...
  • 资料里说的是为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。失效的连接是怎样一种情况呢?我们都经历过网络不好的时候,网络中的延迟现象也是时有发生的。当客户端发送的一...
  • 与物联网平台、IoT PaaS一样,属于同类型产品,主要是对设备进行抽象,快速集成、采集,提供统一设备和数据管理服务,以及统一上层应用接口,对应用层屏蔽接入设备或系统差异,极大降低物联网项目应用成本。...
  • 下列属于面向对象开发方法的是(A B C D)。 A) Booch B) UML C) Coad D) OMT 6. 软件危机的主要表现是(B D)。 A) 软件成本太高 B) 软件产品的质量低劣 C) 软件开发人员明显不足 D) 软件生产率低下 7...

空空如也

空空如也

1 2 3 4
收藏数 70
精华内容 28
关键字:

以下属于同步通信的是