在串口的工作模式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
}
}
关键字:串口 多机通讯
引用地址:
串口多机通讯的理解
推荐阅读最新更新时间:2024-03-16 14:33
STM32串口IAP(YModem)
在之前的《STM32串口IAP》一文中,通过传输数据流来升级程序,但是这种 裸 数据的传输方式存在这许多的问题,比如它没有容错机制,不能保证数据的正确传输,还比如说它无法获知升级文件的信息,导致它在判断何时停止接收数据上“犹豫不决”。正式为了解决上面的问题,才引进了YModem协议。 在《YModem协议简介》一文中,已经详细介绍了YModem的协议,这里就不再赘述,这篇文章就来讲讲如何将YModem协议转换成代码,并应用到串口升级的功能中。 还是以我自己的规范工程为例,讲讲走YModem协议的IAP工程的的实现。 1、工程的修改 1)串口升级当然需要用到USART与FLASH了,我的原工程已经添加了串口的库文件stm32f10x
[单片机]
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
[新品]