串口多机通讯的理解

发布者:DreamyMoon最新更新时间:2015-09-29 来源: eefocus关键字:串口  多机通讯 手机看文章 扫描二维码
随时随地手机看文章
在串口的工作模式2,3中是属于多机通信模式,以模式3为例;

模式3,是9位数据异步通信模式(加起始,停止11位),第9位位可编程位,(RB8,TB8).比特率可变

在模式3中多了一位SM2控制位;

 

原理:在通讯模式2,3中,发射端设置TB8的状态区别发送的是地址还是数据,1(地址),0(数据)。接收端通过RB8的接受进行识别,当SM2=1时,若接收到RB8=1,则确认主机发送的是地址帧,数据会进入SBUF区,并置为RI,会产生中断,若接受的是RB8=0,则为数据帧,将不予理睬,舍弃。当SM2=1时,不管接受到的RB8为0或者1,都会存入SBUF中,产生中断,故利于用此原理可以多机通讯;

 

 

工作过程如下:

1、将从机SM2置为1,处于只接受地址帧的状态;

2、主机发送地址帧,将TB8设为位1,表示发送的是地址;

3、所有的从机接受的地址帧后,将接受的数据与本机的地址对比,相等,则为寻址从机,将SM2设为0,接受从机发来的数据,直到接受完主机发来的所有数据,判断是否数据发送完,完了将SM2设为1;

4、主机在发完地址之后,会发送一组数据(将TB8设为0),表示发送的是数据;

5、主机发完一组数据后,再发新的地址,重复上述步骤;

 

程序实例:

1、主机程序

#include"reg51.h"

//初始化串口设置

void init(void)
{
    TMOD=0x20;
    TH1=0xfd;
    TL1=0xfd;
    PCON=0x00;
    TR1=1;
    SCON=0xd0; //设置工作模式3  ,1101,0000,SM0=1,SM1=1; (工作模式3)  REN=1(允许接受标志)
}

//主机发送信息函数,,简单模拟

void send(uchar addr,uchar dat[])
{ uchar i;

 

      TB8=1;             
      SBUF=addr;      //发送地址信息
       while(TI==0)
         {
           ;
         }
       TI=0;

      while(RI==0)  //等待从机回应
       {
        ;
       }
        data1=SBUF;
        RI=0;
       if(data1!=addr)  / /是否与发送地址一致,不一样则重发
         {
          flag2=0;
          
         }
     else{                      //一致则发送一组数据
             TB8=0;          //tb8设为0,发数据

       for(i=0;i<4;i++)    //发送数据块

{
             SBUF=dat[i]      

        while(TI==0)
             {
                ;
             }
             TI=0;

       
 void main()

{

init();

while(1)

{

 send(addr,dat[]);

}

                        

 

从机部分

#define addr 0xxx;  主机地址

void init(void)
{
    TMOD=0x20;
    TH1=0xfd;
    TL1=0xfd;
    PCON=0x00;
    TR1=1;
    SCON=0Xd0;
}

 

void receive(void)
    
      SM2=1;
      while(RI==0)
          {
            ;
          }
      data1=SBUF;
      RI=0;
      if(data1!=addr)  //不是,则舍弃 返回主函数,等待下次的呼唤
          { 

             
           }
     else {                  //是呼唤的本机,对主机返回地址
            TI=0;       
            TB8=1;        //表示发出的是地址
            SM2=0;
            key2=1;
            SBUF=addr;
            while(TI==0)
               {
                ;
               }
             TI=0;
             TB8=0;

      for(i=0;i<4;i++)

      {

           While(!RI);

           R1=0;

           dat[i]=sbuff;

      }

      SM2=1;        //接受完数据将SM2设为1

    }

}

关键字:串口  多机通讯 引用地址:串口多机通讯的理解

上一篇:struct和typedef struct
下一篇:STM8s--定时器(time4)

推荐阅读最新更新时间:2024-03-16 14:33

STM32串口IAP(YModem)
在之前的《STM32串口IAP》一文中,通过传输数据流来升级程序,但是这种 裸 数据的传输方式存在这许多的问题,比如它没有容错机制,不能保证数据的正确传输,还比如说它无法获知升级文件的信息,导致它在判断何时停止接收数据上“犹豫不决”。正式为了解决上面的问题,才引进了YModem协议。 在《YModem协议简介》一文中,已经详细介绍了YModem的协议,这里就不再赘述,这篇文章就来讲讲如何将YModem协议转换成代码,并应用到串口升级的功能中。 还是以我自己的规范工程为例,讲讲走YModem协议的IAP工程的的实现。 1、工程的修改 1)串口升级当然需要用到USART与FLASH了,我的原工程已经添加了串口的库文件stm32f10x
[单片机]
STM32<font color='red'>串口</font>IAP(YModem)
linux串口终端驱动——s3c6410平台(三)
上一篇关注的是tty上层字符层面的操作和注册,这一篇主要关注线程的注册,如何与上层建筑联系起来。 一、 tty_ldisc.c提供了tty_register_ldisc()接口用于注册线路规程,例如/driver/char/n_tty.c文件则针对N_TTY线路规程实现了具体的tty_disc结构体中的成员。 tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY) 其中有 #define N_TTY 0 struct tty_ldisc_ops tty_ldisc_N_TTY = { .magic = TTY_LDISC_MAGIC, .name = n_tt
[单片机]
STM32串口接收丢失字符
重定向使用MicroLib 串口波特率设置为115200 单个字符发送,大部分操作无反馈,少部分操作有正确反馈; 1.修改串口波特率为9600 有所改善,但并未解决问题 2.修改串口中断优先级为抢占有限级 1 子优先级 3 无改善 3.停止使用串口中断,使用查询标志位方式完成接收 问题解决
[单片机]
Atmega128串口UART 0/1测试代码
#include avr/io.h #define fosc 7372800UL //晶振7.3728MHZ #define baud 9600//波特率 #define com0 void uart0_init(void) { UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C =(1 UCSZ01)|(1 UCSZ00);//8bit+1bit stop UBRR0L=(fosc/16/(baud+1))%256; UBRR0H=(fosc/16/(baud+1))/256; UCSR0B =(1 RXEN0)|
[单片机]
用PIC低档单片模拟串口通讯.
串口通讯一般需要单片机带串口通讯接口,而此类单片机一般较贵,可否用普通单片机做串口通讯? 答案是肯定的,但是,通常用于发送数据,接收数据相对就麻烦一些. 串口通讯的原理我就不讲了,各位可以去查询相关的书籍,以下是我做的用于IPOD控制的串口通讯程序.是用普通的PIC12F508单片机实现的.由于我比较穷,没有买IPOD,所以程序是否能正常运作并没有实践过,在此声明.此程序只做抛砖引玉之用. ;IPOD REMOTE CONTROL PORGRAM ; vcc +----V-----+ groud ; PLAY/PAUSE | GP0|TxD--- IPOD ; VOL+ |
[单片机]
stm32学习笔记--串口波特率
这几天的学习有什么问题呢?开始看前几个例程的时候貌似还找到些感觉,学了些东西,比如串口需要配置的波特率是如何计算的,如何通过位段位带别名区的设计实现对I/O口单个位的寻址操作,端口模式如何设置,spi与iic之间各自的优势和劣势,上个周稀里糊涂看了那么多,现在一想就剩下这些了,然后是这个周,这个周的感觉是更加的不扎实,很多东西都是走马观花,看了就忘,比如中断控制,直到看了第二遍才形成框架,看门狗DMA游戏手柄红外通信的各个实验,好吧,这些东西我仅仅知道是怎么回事,对他们的了解甚至不如上个周的模块,至少还有个框架,到了这里,只剩下 哦,这个,我知道 就没了,对!就没了。所以接下来要去改程序,不管改什么程序,当然最好是直接拿三轴加速度
[单片机]
TI MSP430 如何实现模拟串口通信
1、背景: 很多时候由于硬件资源有限,但又需要使用串口通信,此时可以考虑使用模拟串口; 2、前提: 要实现特定bps的串口速率,需要相应频率的定时器,保证误码率在可以接受的范围内; 例如: 1MHz的时钟最高可模拟9600bps的通信速率:1M/9600 = 104 误码率 1% 3、参考代码: //****************************************************************************** // ACLK = TACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO // //* An ext
[单片机]
意法半导体(ST)推出符合SMIA标准的手机相机视频解串器
ST推出一个针对手机优化的具有I2C电平转换功能的微型封装CSI-1 / CCP2解码器 中国, 2006 年 6 月 21 日 — 世界 CMOS 图像传感器技术的领导厂商意法半导体 ( 纽约证券交易所代码 : STM ) 日前推出第一个支持 MIPI CSI-1 和 SMIA CCP2 class 0 串口的视频解串器接口芯片。 CSI-1 接口是 MIPI ( 移动工业处理器接口 ) 标准规定的接口,而 CCP2 class 0 是 SMIA ( 标准移动图像处理体系结构 ) 微型摄像机模块开放标准定义的接口。 这个新的接口 IC 被命名为 STCCP2
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved