精华内容
下载资源
问答
  • 因为不清楚SBUF内的数据存储方式,所以无从下手,特来求解。网上已有的解释是SBUF每次只读一个字节,那么输入12345,它的读取方式是怎样的,希望大家能够给一些指导。 PS:重点是串口中断函数部分接收到的数据转变...
  • 我现在要做一个全站仪的数据读取接口,由于不了解全站仪数据的发送方式,缓冲区大小该如何设置,才不会造成数据丢失? 比如我设置缓冲区大小为1024,我一次性发送2048个字节...有什么别的传输方式可以避免这样的问题嘛?
  • 与手持终端之间的数据传输需解决通信问题。若采用有线数据传输方式显然是不合适的; 采用无线电 通讯方式, 在恶劣的电磁环境下, 要保障数据接收的可靠性, 必须提高电台的发射功率。这样一方面需 申请专用频点; 另一...
  • Micro2440数据传输---串口通信

    千次阅读 2016-04-02 18:44:02
    或许这是最简单的通信方式吧,想弄清楚简单的数据传输协议。比较经典的i2c、CAN等数据传输,到以后的usb、ZigBee的数据传输。在这里先聊一聊串口的数据传输。 在Micro2440开发板上进行串口通信,要做的第一步便是...

    这段时间经过这次对比赛的准备,使用到了串口通信。或许这是最简单的通信方式吧,想弄清楚简单的数据传输协议。比较经典的i2c、CAN等数据传输,到以后的usb、ZigBee的数据传输。在这里先聊一聊串口的数据传输。

    在Micro2440开发板上进行串口通信,要做的第一步便是串口驱动。这次我的开发板已经移植好了串口驱动。我只需进行操作,这里简单记录串口的基本操作 收数据发数据以后用起来也方便,驱动下次分析。

    串口通信

    分类:同步串口通信(SPI)、异步串口通信(UART)

    同步串行是指SPI(Serial Peripheral interface)的缩写,顾名思义就是串行外围设备接口。SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息,TRM450是SPI接口。

    异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。UART是一个并行输入成为串行输出的芯片,通常集成在主板上。UART包含TTL电平的串口和RS232电平的串口。 TTL电平是3.3V的,而RS232是负逻辑电平,它定义+5~+12V为低电平,而-12~-5V为高电平,MDS2710、MDS SD4、EL805等是RS232接口,EL806有TTL接口。

    串口数据传输的特点

    1.传输速度慢,数据量不大,数据一位一位的顺序传输

    2.支持双向通信,只需一对数据线,也可以一根单向通信

    TXD  ---------> RXD
    
    RXD  <--------- TXD
    
    GND  <--------> GND
    

    串口的参数配置

    int set_opt(int fd, int nSpeed, int nBits, char nEvent, int nStop)  
    {  
        struct termios newtio;  
        struct termios oldtio;  
    
        if(tcgetattr(fd,&oldtio) != 0)  
        {  
            perror("SetupSerial 2");  
            return -1;  
        }  
    
        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;  
            case 460800:  
                cfsetispeed(&newtio,B460800);  
                cfsetospeed(&newtio,B460800);  
                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");  
            return -1;  
        }  
        printf("set done!\n");  
        return 0;  
    }  
    
    int open_port(int fd,int comport)  
    {  
        char *dev[]={"/dev/ttySAC0","/dev/ttySAC1","/dev/ttySAC2"};  
        long vdisable;  
        if(comport == 1)  
        {  
            fd = open("/dev/ttySAC0",O_RDWR|O_NOCTTY|O_NDELAY);  
            if(fd == -1){  
                perror("Can't Open Serial Port");  
                return -1;  
            }  
        }  
    
        else if(comport == 2)  
        {  
            fd = open("/dev/ttySAC1",O_RDWR|O_NOCTTY|O_NDELAY);  
            if(fd == -1){  
                perror("Can't Open Serial Port");  
                return -1;  
            }  
        }  
    
        else if(comport == 3)  
        {  
            fd = open("/dev/ttySAC2",O_RDWR|O_NOCTTY|O_NDELAY);  
            if(fd == -1){  
                perror("Can't Open Serial Port");  
                return -1;  
            }  
        }  
    
        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 sucess!\n");  
        }  
    
        printf("fd-open=%d\n",fd);  
        return fd;  
    }  
    

    接收串口数据

    nread = read(fd,buff,n)

    发送串口数据

    nwrite = write(fd,buff,length);  
    

    实际应用

    上面两个程序可以完成数据的收发,在具体的项目中在串口的数据传输中多种数据的传输时,会涉及到一些简单的数据处理,需要自定义一些协议。这时串口数据的收发必须精确的每个字符,不能多一个也不能少一个。

    read、write函数,它们读写的字符必须精准,在write时写入数据的大小必须和字符串的大小一致。在送单一的数据时,对写数据大小不做要求可是在自定义协议中数据的大小关系到对方的解析。

    这次使用的数据格式:FD 00 06 02 00 31 33 33 C8

    char Speaker(char CMD,char par,char * pString)
    {  
        char headOfFrame[5];  
        char length;         //定义字符串长度  
        char ecc = 0;        //定义校验字节  
        int i = 0;   
        if (pString == NULL) //空字符串   
            return 1;        
        headOfFrame[0]=0XFD;       //构造帧头FD  
        headOfFrame[1]=0X00;       //构造数据区长度的高字节 
        length = strlen(pString);  //需要发送文本的长度  
        headOfFrame[2]=length+3;   //构造数据区长度的低字节  
        headOfFrame[3]=CMD;        //构造命令字:合成播放命令  
        headOfFrame[4]=par;        //构造命令参数:编码格式为GB2312   
        for(i=0;i<5;i++)           //依次发送构造好的5个帧头字节  
        {    
            ecc=ecc^(headOfFrame[i]); //对发送的字节进行异或校验     
            write(fd,&headOfFrame[i],1);  
        }
        for(i=0;i<length;i++)         //依次发送待合成的文本数据   
        {
            ecc=ecc^(*pString);   
            write(fd,pString,1);
            pString ++;   
        }
    
        write(fd,&ecc,1);    //最后发送校验和
        return 0; //成功返回0 
    }  
    展开全文
  • FPGA串口通信要想应用在实际工业现场,需要一整套完整协议,来确保数据传输的可靠性和系统稳定性。基于协议,进行串口指令解析是控制关键,对于串口指令解析,有两种方式:逻辑解析和软硬核(我用Altera...

    FPGA串口通信要想应用在实际的工业现场,需要一整套完整的协议,来确保数据传输的可靠性和系统的稳定性。基于协议,进行串口指令解析是控制的关键,对于串口指令解析,有两种方式:逻辑解析和软硬核(我用的Altera的嵌入式软核NIOS)解析。

    使用逻辑进行解析,往往使用逻辑进行数据收发,此处可参看小梅哥《FPGA数字系统设计教程》,其核心在于数据接收部分的设计,也即是数据帧接收状态机的设计。状态机大致包括以下状态:帧头、字节数、数据、帧尾。默认情况下,状态机处于帧头状态,如果检测到帧头,则进入下一状态,否则,状态机仍然处于帧头,依此循环,直至检测完一个数据帧,此时产生一个高信号,同时将检测到的数据帧锁存,用于解析指令状态,同时,开始下一数据帧的接收。

    使用Nios进行解析,通常使用Altera自带的Uart核来完成数据收发,此部分请参看我的博文《基于nios的串口通信uart设计》,地址如下:http://blog.chinaaet.com/helimin/p/5100018309

    具体协议参看我的博文《FPGA串口通信及数据解析》,地址如下:

    http://blog.chinaaet.com/helimin/p/5100051178

    使用中断的方式,每接收到1个字节,进行一次中断。接收到数据后,进行解析,思路如下:

    1. 定义一个指令缓存数组recBuf,每次进入中断,就将接收到的1字节数据存至数组,同时数组尾部索引recTailPointor自加1。

    void uart0_isr(void * context,alt_u32 id)
    {
        rxdata0 = IORD_ALTERA_AVALON_UART_RXDATA(UART_0_BASE);
        recBuf[recTailPointor] = rxdata0;//获取数据
        recTailPointor += 1;
    }

     

    2. 进入串口解析函数,在里面进行如下操作:调用当前字节数计算函数,计算放入数组中的字节数

     

    inline alt_u8 getRecLen(void)
    {
        alt_u8 lureclen = 0;
        if(recHeadPointor <= recTailPointor){
            lureclen = recTailPointor - recHeadPointor;
        }
        else{ //如果recHeadPointor > recTailPointor,说明recBuf[256]已经写到最后,又从头重写。
            lureclen = 256 - (recHeadPointor - recTailPointor);
        }
        return lureclen;
    }

    3. 在串口解析函数判断放入数组中字节数是否大于0,如果大于0则判断数组中第一个元素是否是帧头,如果是帧头,再根据第二个元素(字节数)来进行数据接收,直到接收完一帧数据。此时将接收数据索引的头指针移至尾部。

     

    alt_u8 UartAnalyze(void)
    {
        alt_u8 i = 0;
        alt_u8 luRecLen = 0;
        alt_u8 lutmp = 0;
        luRecLen = getRecLen();        //判断放入串口数据接收数组中的数据字节数
        if(luRecLen > 0){
            if(recBuf[recHeadPointor] == 0xcc){
                while(1){//一直等到接收完一帧指令跳出此循环
                    if(uartOverTimeFlag == 0){
                        luRecLen = getRecLen();
                        if(luRecLen >= 1){
                            if(luRecLen > (recBuf[recHeadPointor+1] + 3)){
                                break;//如果接收完一帧,则跳出循环,继续向下执行
                            }
                        }
                    }
                    else{
                        recHeadPointor = recTailPointor;//头移到尾处。
                        recTime = 0;
                        uartOverTimeFlag = 0;
                        return ERROR_OVERTIME;
                    }
                }
                //一帧数据长度足够则将数据转到uartCMDBuf[]中。
                for(i=0;i<=luRecLen;i++){
                    lutmp = recHeadPointor + i;
                    uartCMDBuf[i] = recBuf[lutmp];
                }
                recHeadPointor = recTailPointor;//头移到尾处。
                recTime = 0;
                uartOverTimeFlag = 0;
     
                if(Get_DRC(uartCMDBuf,uartCMDBuf[1]) == uartCMDBuf[uartCMDBuf[1]+1]){
                    return CMD_CORRECT;
                }
                else{//if(Get_DRC(uartCMDBuf,uartCMDBuf[1]) == uartCMDBuf[uartCMDBuf[1]+1])
                    return ERROR_DRC_NO_PASS;
                }
            }
            else{//if(recBuf[recHeadPointor] == 0xcc)&& if(recBuf[recHeadPointor] == 0xf0)
                recHeadPointor = recTailPointor;//头移到尾处。
                recTime = 0;
                uartOverTimeFlag = 0;
                return ERROR_SHAKE_HANDS;
            }
        }
        else{//luRecLen=0说明没有串口数据。
            recHeadPointor = recTailPointor;//头移到尾处。
            recTime = 0;
            uartOverTimeFlag = 0;
            return 0;
        }
    }

     

    在数据接收时,为了使得系统更稳定,使用定时器进行超时判断,如若一段时间指令都没有接收完毕,则放弃此次接收。

    一帧数据接收完毕后,进行CRC循环校验、帧尾检测,如果都ok,则将接收数组中的一帧数据转移,用于数据的解析,同时,开始下一帧数据的接收。

    当时写这个串口解析部分的程序,得到了高手的指点,花了两个多星期。其实基本思路比较简单,使用中断进行数据接收,在解析函数中根据协议进行接收,接收完后再根据协议进行解析。

    两种方式中,对于简单的工程应用,可以使用方式一;而对于比较复杂的协议,有时涉及到上百种控制,并且不同的数据包字节数可能不一样时,使用方式二会显得非常适合。

    重点是协议,制订一份好的协议至关重要。

    展开全文
  • 串口通信的基本知识

    万次阅读 多人点赞 2014-07-02 14:41:03
    [编辑简介]:本文介绍了... 串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式串口是一种接口标准,它规定了接口电气标准,没有规定接口插件电缆

    串口通信的基本知识

     

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,分享一下给大家。点击跳转到教程

    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。
    串口通讯,RS232,RS485,停止位,奇校验,偶校验

    1 串口通讯
        串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
        串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。


    2 串口通讯的数据格式


        一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
        每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

    3 通讯方式
        单工模式(Simplex Communication)的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
    半双工模式(Half Duplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线。半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。
        全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。
        显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,效率要高。

    4 偶校验与奇校验
        在标准ASCII码中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

    5 停止位
        停止位是按长度来算的。串行异步通信从计时开始,以单位时间为间隔(一个单位时间就是波特率的倒数),依次接受所规定的数据位和奇偶校验位,并拼装成一个字符的并行字节;此后应接收到规定长度的停止位“1”。所以说,停止位都是“1”,1.5是它的长度,即停止位的高电平保持1.5个单位时间长度。一般来讲,停止位有1,1.5,2个单位时间三种长度。

    6 波特率
        波特率就是每秒钟传输的数据位数。
        波特率的单位是每秒比特数(bps),常用的单位还有:每秒千比特数Kbps,每秒兆比特数Mbps。串口典型的传输波特率600bps,1200bps,2400bps,4800bps,9600bps,19200bps,38400bps。
        PLC/PC与称重仪表通讯时,最常用的波特率是9600bps,19200bps。PLC/PC或仪表与大屏幕通讯时,最常用的波特率是600bps。

    7 典型的串口通讯标准
        EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。
        EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。

    8 RS232串口
        RS232是计算机与通信工业应用中最广泛一种串行接口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。
    8.1 RS232串口缺点
        ●接口信号电平值较高,接口电路芯片容易损坏。
        ●传输速率低,最高波特率19200bps。
        ●抗干扰能力较差。
        ●传输距离有限,一般在15m以内。
        ●只能实现点对点的通讯方式。
    8.2 RS232串口接口定义
        RXD:接收数据,TXD:发送数据,GND/SG:信号地。
    8.3 电脑DB9针接口定义
        电脑DB9针接口是常见的RS232串口,其引脚定义如下:
        2号脚:RXD(接收数据)
        3号脚:TXD(发送数据)
        5号脚:SG或GND(信号地)
        其它脚:我们不用


        

        电脑RS232串口与仪表串口连接图:
     
        

    9 RS485串口
    9.1 RS485串口特点
        ●RS485采用平衡发送和差分接收,具有良好的抗干扰能力,信号能传输上千米。
        ●RS485有两线制和四线制两种接线。采用四线制时,只能实现点对多的通讯(即只能有一个主设备,其余为从设备)。四线制现在很少采用,现在多采用两线制接线方式。
        ●两线制RS485只能以半双式方式工作,收发不能同时进行。
        ●RS485在同一总线上最多可以接32个结点,可实现真正的多点通讯,但一般采用的是主从通信方式,即一个主机带多个从机。
        ●因RS485接口具有良好的抗干扰能力,长的传输距离和多站能力等优点使其成为首选的串行接口。
    9.2 485抑制共模干扰示意图

        
    9.3 RS485串口接口定义
        A或Data+(D+)或+:信号正;
        B或Data-(D-)或-:信号负。
    9.4 计算机与RS485仪表通讯
        计算机自带的串口只有RS232,没有RS485,如果计算机要与RS485串口的仪表进行通讯,必须使用串口转换器或装上RS485串口转换卡后才能进行通讯。
    9.5 RS485串口的终端电阻
        ●一般情况下不需要增加终端电阻,只有在RS485通信距离超过100米的情况下,要在RS485通讯的开始端和结束端增加终端电阻,RS485典型终端电阻是120欧。
        ●终端电阻是为了消除在通信电缆中的信号反射在通信过程中,有两种信号因导致信号反射:阻抗不连续和阻抗不匹配。
        阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。
        引起信号反射的另一原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。

    10 串口通讯硬件常见的注意事项
        ●通讯电缆端子一定接牢,不可有任何松动,否则,可能会烧坏仪表或上位机的通讯板。
        ●不可带电拔插通讯端子,否则,可能会烧坏仪表或上位机的通讯板,一定要关闭仪表电源后才能去拔插通讯端子或接通讯线。
        ●通讯用的屏蔽电缆最好选用双层隔离型屏蔽电缆,其次选用单层屏蔽电缆,最好不要选用无屏蔽层的电缆,且电缆屏蔽层一定要能完全屏蔽,有些质量差的电缆,屏蔽层很松散,根本起不到屏蔽的作用。单层屏蔽的电缆屏蔽层应一端接地,双层屏蔽的电缆屏蔽层其外层(含铠装)应两端接地,内层屏蔽则应一端接地。
        ●仪表使用RS232通讯时,通讯电缆长度不得超过15米。
        ●一般RS485协议的接头没有固定的标准,可能根据厂家的不同引脚顺序和管脚功能可能不尽相同,用户可以查阅相关产品RS485的引脚图。
        ●RS485通讯电缆最好选用阻阬匹配、低衰减的RS485专用通讯电缆(双绞线),不要使用普通的双绞电缆或质量较差的通讯电缆。因为普通电缆或质量差的通讯电缆,可能阻抗不匹配、衰减大、绞合度不够、屏蔽层太松散,这样会导致干扰将非常大,会造成通讯不畅,甚至通讯不上。
        ●仪表使用RS485通讯时,每台仪表必须手牵手地串下去,不可以有星型连接或者分叉,如果有星型连接或者分叉,干扰将非常大,会造成通讯不畅,甚至通讯不上。


        

        ●485总线结构理论上传输距离达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常,所以通常485总线实际的稳定通讯距离远远达不到1200米。负载485设备多,线材阻抗不同时,通讯距离更短。
        ●仪表使用RS485通讯时,必要时,请接入终端电阻,以增强系统的抗干扰性,典型的终端电阻阻值是120欧。

    11 串口通讯软件设置要点
    11.1 有关通讯的一些基本概念
        ●主机与从机:在通讯系统中起主要作用、发布主要命令的称为主机,接受命令的称为从机。
        ●连续方式:指主机不需要发布命令,从机就能自动地向主机发送数据。
        ●指令方式:指主机向从机发布命令,从机根据指令执行动作,并将结果“应答”给主机的模式。
        ●输出数据类型:指在连续方式通讯时,从机输出给主机的数据类型。
        ●通讯协议:指主机与从机通讯时,按哪一种编码规则来通讯。
        ●波特率:主从机之间通讯的速度。
        ●数据位:每次传输数据时,数据由几位组成。
        ●校验位:数据传输错误检测,可以是奇校验、偶校验或无校验。
        ●地址:每一台从机的编号。
    11.2 主从机之间通讯设置要点
        ●要点一:主/从RS232/485硬件有无设置正确,通讯线有无接对。有些通讯板卡是RS422与RS485共用的,依靠板上跳线来实现的,有些仪表RS232/485也需要通讯跳线来实现。
        ●要点二:主机上的通讯端口有无设置正确;超时(一般设置为2s)、通讯延时(一般设置为5~20ms)、ACK信号延时(一般设置为0ms)有无设置正确。
        ●要点三:主/从机通讯协议有无选择正确。
        ●要点四:主/从机波特率有无选择正确。
        ●要点五:主/从机数据位有无选择正确。数据位可以选择7位,8位。
        ●要点六:主/从机校验位有无选择正确。校验位一般可选择偶校验、奇校验、无校验。
        ●要点七:主/从机停止位有无选择正确。停止位可以选择1位、1.5位还是2位。
        ●要点八:从机地址有无选择正确。
        ●要点九:主/从机的通讯方式有无选择正确。

     
    进行通讯测试的时候经常会进行线路测试,测试所用的串口线是否可用,方法有二如下:
     
    1  把串口线接到不同的串口,用串口调试工具从一个串口发数据,另一个能正常收到说明串口线是OK的。
    2  把串口线的一端短接(用金属把2,3号脚连通),用万用表测另一端的2,3号如果正常的话会有嘀嘀的短接报警声。
     
    展开全文
  • 结合串口通信的机理和多线程同步方式,分析了Win32系统下多线程异步串口通信程序的开发方法.  1 引 言  串行通讯是计算机与其他设备进行数据交换时经常使用的方法之一,他具有实现简单,使用灵活方便,数据传输可靠...
  • 串口是怎样传输数据的

    千次阅读 2020-06-24 16:59:08
     ➹通过逻辑分析仪捕捉串口传输的数据来了解串口传输数据的实质。    串行接口简称为串口,串行接口 (Serial Interface)是指数据一位一位地顺序传送。实现双向通信就需要一对传输线,即TX与RX线。 电路连接方式...

    ✍概述
      ➹通过逻辑分析仪捕捉串口传输的数据来了解串口传输数据的实质。
      
      串行接口简称为串口,串行接口 (Serial Interface)是指数据一位一位地顺序传送。实现双向通信就需要一对传输线,即TX与RX线。
    电路连接方式:
      串口如果要实现双向传输,则设备1与设备2,TX与RX要交叉相连。
    在这里插入图片描述
    串口数据解析
      利用电脑端的串口助手通过CH340串口模块将数据0x55发送出去,并通过逻辑分析仪来捕捉数据。下图为串口发送的数据,是以十六进制(hex)形式发送的。
    在这里插入图片描述
    逻辑分析仪捕捉数据:
    在这里插入图片描述
    我们看到逻辑分析仪成功将数据0x55捕捉到。接下来看串口的数据构成是怎样的。
    查阅资料,串口传输一帧数据如下图所示:
    在这里插入图片描述
    所谓串口的一帧数据即串行的发送一次数据(比如0x55(0101_0101))时TX数据线上的电平变化。由上图可知串口一帧数据的构成为:起始位(1bit)+数据(8bit)+奇偶校验位+停止位(1bit),8bit数据传输的方式为先低位(LSB)再高位(MSB)即通过(D0_D1_D2_D3_D4_D5_D6_D7)的顺序将数据依次放置在TX数据线上。我们再看我们所用的串口助手:
    在这里插入图片描述
    我们的设置为传输数据位为8bit,检验位为0bit即没有校验位,停止位为1bit。所以我们串口一帧数据的构成为:起始位(1bit)+数据(8bit)+停止位(1bit),所以串口一帧数据的传输单位为10bit,平时我们所说的串口传输单位为1Byte即8bit是指传输的有效数据,即起始位(1bit)+数据(8bit)+停止位(1bit)中的8bit数据,那为什么要多此一举的在收尾处各加1bit的数据呢,其实是为了接收设备能去正确的接收到8bit的有效数据,起始位相当于一帧数据的帧头,停止位相当于一帧数据的帧尾。
    起始位: 数据线TX由高电平变为低电平。
    停止位: 数据线TX由低电平变为高电平。
    起始位和停止位作用:
      如果接收设备检测到数据线由高电平变为低电平,就是接收到了来自发送设备的起始信号,表示开始数据的传输。如果接收设备检测到数据线由低电平变为高电平,就是接收到了来自发送设备的停止信号,表示一帧数据的结束,通过以上特点接收设备就可以将中间的8bit有效数据解析出来,这样就完成了一帧数据的传输。
    解析逻辑分析仪捕捉的数据
      由以上分析知串口传输一帧数据构成:起始位(1bit)+数据(8bit)+停止位(1bit)。
    解析逻辑分析仪获取的数据:
    在这里插入图片描述
    通道一:TX数据线
    通道二:数据解析
    通过通道一可以观察出一帧数据的格式确实为:起始位(1bit)+数据(8bit)+停止位(1bit)。中间8bit数据是通过(D0-D7:1010_1010)的顺序发送的,通过接收设备解析(高字节_低字节)为(D7-D0:0101_0101)即0x55。以上就为串口一帧数据的传输。
    ------所谓的波特率-----
    进一步观察逻辑分析仪:
    在这里插入图片描述
    由标号①和②知1bit数据的传输时间为8.667us,那传输速率不就是18.667106{1 \over {8.667*{{10}^{ - 6}}}}其实就是115200bit/s。再看看我们串口助手设置的波特率就为115200,这样是不是明白波特率是什么了,其实不就是1s传输115200bit数据。
    在这里插入图片描述
    详情可以看看什么是波特率,波特率怎么计算

    ★★★如有错误,欢迎指导!

    展开全文
  • 树莓派与Arduino之间常用的通信的方式有: 1、通过USB串口进行通信 2、通过GPIO引脚通信 这里我们采用第一种方式,Arduino与树莓派通过USB串口不仅稳定,而且不用复杂的接线。 1、Arduino连接DHT11温湿度传感器 在...
  • 为了提高串口数据通信的准确率、方便上层应用编程,设计了一个协议对串口数据通信协议进行封装。协议采用自定义报文格式封装串口数据帧的方式工作,利用报文应答机制保证传输正确性,该协议在线路故障出现时能有效...
  • 在单片机应用领域,串口是上位机和下位机进行通信和数据交换的重要方式,但由于浮点型数据占用字节数超过了一个字节,故无法通过串口进行直接传输,涉及到数据的分散和合成,本VI即为解决该问题而编写。通过适当...
  • 为了保证双处理器间数据通信的稳定可靠,兼顾实现方式的低成本和易移植,本文提出了在串口通信中引入TCP/IP协议栈来实现处理器间的通信。在该方式的实现过程中解决了上层协议栈和串口驱动之间的数据交换问题和物理...
  • 处理器与外部设备通信的两种方式:并行通信和串行通信 并行通信 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信 传输原理:数据按位顺序传输。 优点:占用引脚资源少 缺点:...
  • 串口通信的基本原理详解

    千次阅读 多人点赞 2020-07-01 11:00:01
    串口通信的数据格式 通讯方式 偶校验与奇校验 停止位 波特率(波特率就是每秒钟传输的数据位数) 典型的串口通讯标准 串口通信 串行接口简称串口,也称串行通信接口(通常指COM接口):是采用串行通信方式...
  • 串行通信可以分为两种类型:同步通信、异步通信。   ... 1.异步通信的特点及信息帧格式:  ...起止式异步通信的特点是:一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始
  • Python 串口通信的实现

    2020-12-16 23:38:59
    串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种...
  • 串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种...
  • 视频教学来源@小蜜蜂老师: 串口通信原理串口通信一、串口通信原理与使用1.通信的工作方式2.数据端口的接受与发送3.串行口的工作方式4....1.单工:指数据传输仅能沿一个方向,不能实现反向传输 2.半双工:指数据
  • 往往需要两块或以上单片机进行通信完成数据传输,例如四旋翼无人机在飞行过程中无线传输数据回到地面站,治疗仪器需要实时将患者和机器运转情况传回上位机平台,粮仓温控装置需将各种传感器通过RS485总线或者CAN总线...
  • 处理器与外部设备通信的两种方式: 并行通信 -传输原理:数据各个位同时传输。 -优点:速度快 -缺点:占用引脚资源多 串行通信 -传输原理:数据按位顺序传输。 -优点:占用引脚资源少 -缺点:速度相对较慢 串行通信 ...
  • 串口通信

    2020-03-23 15:22:52
    单工:模式的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。 半双工:数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。 全双工:通信允许数据在两个方向上同时传输,...
  • 蓝牙 BLE BLE-CC254x-1.4.1.43908协议栈串口默认是串口0,RX和TX...如图: 需要修改协议栈部分代码才可以使用串口0 Alt2方式传输数据。 1.Option-c/c++ Compiler Preprocessor-Defined symbols添加宏编译定义: HA...
  • 众所周知,串口都是十六进制进行通信,而我要做的是通过串口实时传输采集的数据。我采集的都是十进制的数字,怎么进行传输呢? 这里关于串口的几个知识要了解下: 串口是通过RX和TX两条线进行一位一位传输通信...
  • 串口通信对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。下面我们就一起学习一下串口通信的原理吧!一、串口通信原理--简介串口通信的概念非常简单,串口通信...
  • 对于基于flash控制器8051芯片结构,一般在进行数据传输时,都是先通过串口将数据传送到flash...1 检错方式基于8051的串口数据通信系统硬件开发平台框图如图1所示。利用该平台进行数据传输时,通常有三种数据...
  • 串口通信中接收数据时延迟处理与缓存处理解决方案C利用串口进行通信当发送方A将数据写入串口后通过无线或有线方式数据传送给接收方BB通过调用串口读方法comm.read参数即可将数据读出。原理十分简单但最近在利用...
  • 串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种...
  • 【STM32】串口通信基本原理(超基础、详细版)

    万次阅读 多人点赞 2018-04-12 13:26:02
    设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是: 并、串行通信的区别 并行通信 串行通信 传输原理 数据各个位同时传输 数据按位顺序传输 ...
  • python 的串口通信

    2020-11-04 09:12:43
    串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种...
  • 按照通信的数据同步方式,可分为异步通信和同步通信。按照数据的传输方式又可分为单工,半双工和全双工通信。 代码 /*实验现象:程序运行后,打开串口调试助手,将波特率设置为4800,选择发送数据就可以显示。 */ #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,096
精华内容 438
关键字:

串口通信的数据传输方式