imx6 配置串口波特率_RS232串口多机通信

一、基本原理

1、主从多机通信拓扑图

d69dd819b6738cdffc9458688ab3debb.png

2、主从多机通信的具体过程

1)使所有的从机的SM2位置1,以便接收主机发来的地址;

2)主机发出一帧地址信息,其中包括8位需要与之通信的从机地址,第9位为1;

3)所有从机接收到地址帧后,各自将所接收到的地址与本机地址比较,对于地址相同的从机,使SM2位清零以接收主机随后发来的所有信息。对于地址不符合的从机,仍保持SM2=1的状态,对主机随后发来的数据不予理睬,直至发送新的地址帧;

4)主机给已被寻址的从机发送控制命令和数据(数据帧的第9位为0);

5)本次通信结束后,从机重置SM2=1,主机可再寻址其它从机。

二、主从模式

首先要设定工作方式3:(主从模式+波特率可变)

SCON位定义:

257231a193bcf9a49e94e753cec33ef4.png

SCON串口功能寄存器:SM0=1;SM1=1(工作方式3)

注:主机和从机都要为工作方式3。

1、工作方式2 (SM0 SM1 :1 0):

串行口为11位异步通信接口。发送或接收一帧信息包括1位起始位“0”、8位数据位、1位可编程位、1位停止位“1”。

发送数据:发送前,先根据通信协议由软件设置TB8为“奇偶校验位”或“数据标识位”,然后将要发送的数据写入SBUF,即能启动发送器。

发送过程是由执行任何一条以SBUF为目的寄存器的指令而启动的,把8位数据装入SBUF,同时还把TB8装到发送移位寄存器的第9位上,然后从TXD(P3.1)端口输出一帧数据。

接收数据:先置REN=1,使串行口为允许接收状态,同时还要将RI清“0”。然后再根据SM2的状态和所接收到的RB8的状态决定此串行口在信息到来后是否置R1=1,并申请中断,通知CPU接收数据。

当SM2=0时,不管RB8为“0”还是为“1”,都置RI=1,此串行口将接收发送来的信息。当SM2=1时,且RB8=1,表示在多机通信情况下,接收的信息为“地址帧”, 此时置RI=1,串行口将接收发来的地址。

当SM2=1时,且RB8=0,表示在多机通信情况下,接收的信息为“数据帧”, 但不是发给本从机的,此时RI不置为“1”,因而SBUF中接收的数据帧将丢失。

2、工作方式3 (SM0 SM1 :1 1):

为波特率可变的11位异步通信方式,除了波特率有所区别之外,其余方式都与方式2相同。

三、代码编写

1、主机.

1)主机的配置发送“地址”时,把TB8设定为1,发送数据时TB8设定为0;

2)主机在配置SCON寄存器时,不需要配置SM2=1;该位主要用于从机接收地址和数据时的区分;

3)其发送帧结构为:

8439dd23251154bc4f63cd302a9b15f4.png

主机的配置,及相关程序为:

//主机为STC12C5A60S2单片机,下面是初始化程序

void UART_init()

{

TMOD =0x20; //定时器1,工作方式2:8位、自动重装

PCON=0x00;//波特率不加倍$

TH1 = 0xfd; //fd: 9600bps @ 11.0592M

TL1 = 0xfd; //e8: 1200bps @ 11.0592M

SCON|= 0xd8; //串行口工作方式3 主机模式,不需设置SM2=1

TR1 = 1; //启动定时器1

ES = 1; //开串口中断

EA = 1; //中断 总开关

}

//主机端发送程序,使用为串口多机通信

void TXdata(unsignedchar addr,unsigned char *str)

TB8 = 1; //发送地址

SBUF = addr; //把地址发送出去

while(!TI); //判断是否发送成功(发送成功后TI会置1,需手动清0)

TI = 0;!

TB8 = 0; //发送数据

while(*str != '0') //发送数组

{

SBUF = (*str);

while(!TI);

TI = 0;-

str++;)

}

}

//中断程序

void UartReceive()interrupt 4 //串口中断服务函数

{!

ES = 0; //关闭串口中断

if(RI) //再次判断,是否接收到数据(接收到数据后,RI会置1,需手动清0)

{

RXData = SBUF;

if(RXData== '*') //判断是否接收到数据结束标志 $

{

LCD_Write_String(0,0,ReceiveData);

j_yang=0;$

}

else if(RXData=='#')

{

LCD_Write_String(0,1,ReceiveData);

j_yang=0;

}9 B7 W. E8 g) U3 i8 E

else //接收到 结束标志 $

{

ReceiveData[j_yang] = RXData;//没有接收到结束标志,正常保存数据至数组

j_yang++;

}

}

RI = 0; //清除接收标志位

ES = 1; //重新开启串口中断

}

2、从机

1)从机接收时,首先串口初始化时,使SM2=1(接收地址模式,即只能接收到TB8=1的数据,才触发中断),主机发送TB8=0的数据,被认为是总线上的主机发送给别机的通信数据,本机丢弃,不产生中断。

2)接收的地址与本机地址相符后,使SM2=0(接收数据模式,接收数据正常触发中断)

从机的配置及相关程序:

//使用的单片机是STC15W4K48S4,该单片机设置独立定时器为波特率发生器,配置程序,若是不使用此种单片机或者是此种波特率发生器,则除了SM2设置不一样之外,其他设置与主机是一致的。

void Serial_Init()

{

SCON = 0xf8; //8位数据,可变波特率

AUXR = 0x14; //允许独立波特率发生器运行,独立波特发生器每1个时钟周期记一次数

AUXR |= 0x01; // 独立波特率发生器作为串口1的波特率发生器,此时定时器1得到释放,可以作为独立定时器使用

T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值,其中FOSC为外部晶振的频率,BAUD为定义的波特率,此处为9600

T2H = (65536 - (FOSC/4/BAUD))>>8;

ES = 1; //使能串口中断

EA = 1;

//中断服务程序

void Uart(void)interrupt 4

{

ES = 0; //关闭串口中断

if(RI) //再次判断,是否接收到数据(接收到数据后,RI会置1,需手动清0)

{

RXData = SBUF;)

if(RXstart) //判断是否接收到过本地址;

{

if(RXData != '*') //判断是否接收到数据结束标志*

{

ReceiveData[j_yang] = RXData; //没有接收到结束标志,正常保存数据至数组

j_yang++;

}

else //接收到 结束标志*

{

RXstart= 0; //本次接收结束

UartSends(ReceiveData);//将接受的数据反过来发送回去

UartSendChar('#');//默认接收以#结束

SM2 = 1; //重新 配置为:只接收地址模式,下次发送TB8=1才中断

j_yang = 0;

Uart_flag1=1;

}

}

if(RXData == 2) //判断是否呼叫本机,地址范围:000– 254(00 - FE)

{

RXstart = 1; //开始接收数据

SM2 = 0; //配置为:接收数据 模式

}

}

RI = 0; //清除接收标志位'

ES = 1; //重新开启串口中断

}

四、注意事项

1)在写主机程序时,发现如果不写中断服务程序,单片机会默认一直发送第一个字节,最后发现应该是串口中断程序影响的,没有串口中断就会一直发送第一个字节,究其原因是数据发送完成后TI会置1,这将导致中断的产生,一旦没有中断服务程序,默认不产生中断,就一直发不清零。

2)主机程序配置时,不需要配置SM2,这样从机不管是谁发送数据,主机都可以接收的到,但是是在通信的时候做区分,比如主机给从机1发消息,发送完成后,从机1立马给主机发送请求的数据,发送完成之后,从机再配置SM2=1,只接收地址的模式。

3)波特率一定要设置的一致,否则无法正常通信。

【如果你喜欢EDA365的文章,记得关注和点赞哦!】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467673.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android设置访问internet权限

如果在app中访问网络&#xff0c;提示internet permission denied&#xff0c;即是没有设置访问网络的权限 在AndroidManifest.xml文件中添加如下一行即可 <uses-permission android:name"android.permission.INTERNET" />转载于:https://www.cnblogs.com/Awan…

一个故事讲完CPU的工作原理

上二年级的小明正坐在教室里。现在是数学课&#xff0c;下午第一节&#xff0c;窗外的蝉鸣、缓缓旋转的吊扇让同学们昏昏欲睡。此时&#xff0c;刘老师在黑板上写下一个问题&#xff1a;6324 244675 &#xff1f;小明抬头看了一眼&#xff0c;觉得这两个数字挺眼熟。他昨天翘…

axure弹窗关闭_干货来袭,Axure插入图标的几种办法

前言在日常绘制原型的时候&#xff0c;经常会需要插入相应的图标&#xff08;icon&#xff09;到Axure中&#xff0c;但是看似好像很简单的事情也给蛮多小伙伴造成了困扰。现在很多开发团队都会用一些比较常见的前端框架来搭建后台管理系统&#xff0c;例如常见的Element-UI&am…

用指针实现高低位倒序,疯了吧

昨晚在微信群看到一个读者发的面试题目&#xff0c;从网上截图出来的&#xff0c;我百思不得其解&#xff0c;题目如图。幸好&#xff0c;我学过栈栈&#xff0c;C语言实现然后我写了个小程序第一个方法比较笨&#xff0c;当我写完自己的代码后&#xff0c;看到有同学发了自己的…

部署nexus服务

一、安装和启动 官网下载nexus-2.12安装包&#xff0c;地址&#xff1a;https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.12.0-01-bundle.tar.gz 此版本需要预先安装jdk1.7 解压后&#xff0c;用命令【./bin/nexus start】来启动 nexus有如下一些控制命令&…

天然气表怎么看多少方_上海考大学难度怎么样?看2019上海高考“成绩分布表”和“本科分数线”就知道了!...

参加高考的同学和家长们注意了~上海市教育考试院近日发布本市普通高等学校秋季招生本科各批次录取控制分数线和成绩分布表。艺术类、体育类本科文化控制分数线也同步公布。&#xff08;鲁申君注&#xff1a;上海2019年高考本科总分660&#xff0c;专科总分450&#xff0c;不分文…

关于Linux内核代码不使用typedef的讨论?

C语言关键字 -&#xff08;typedef关键字&#xff09;typedef有点像火隐忍者里面的万花筒写轮眼&#xff0c;用起来非常炫酷有型&#xff0c;使你的代码更加简短&#xff0c;让你穿上你亲妈都认不出你的马甲…比如这样一段代码typedef struct point{int x, y;} Points;Points f…

基于深度学习模型的花卉图像分类代码_华为不止有鸿蒙!教你快速入门华为免编程深度学习神器ModelArts...

引言&#xff1a;本文介绍利用华为ModelArts进行深度学习的图像分类任务&#xff0c;不用一行代码。今年8月9日&#xff0c;在华为史上规模最大的开发者大会上&#xff0c;华为正式发布全球首个基于微内核的全场景分布式OS——鸿蒙操作系统(HarmonyOS)。但你知道吗&#xff1f;…

洛谷P3405 [USACO16DEC]Cities and States省市

P3405 [USACO16DEC]Cities and States省市 题目描述 To keep his cows intellectually stimulated, Farmer John has placed a large map of the USA on the wall of his barn. Since the cows spend many hours in the barn staring at this map, they start to notice severa…

天线的原理

关注、星标公众号&#xff0c;不错过精彩内容来源&#xff1a;中兴文档小时候家里的收音机、电视机&#xff0c;都带着可以灵活转动拉伸的杆子&#xff0c;大家一定对这个可以转来转去的杆子记忆犹新&#xff0c;或许也好奇的发现这个杆子的长度与方向和收音机、电视的接收效果…

2d 蓝图_“蓝图”卷积--对深度可分离卷积的再思考

论文&#xff1a;Rethinking Depthwise Separable Convolutions: How Intra-Kernel Correlations Lead to Improved MobileNetshttps://arxiv.org/pdf/2003.13549.pdf​arxiv.org代码地址&#xff1a;zeiss-microscopy/BSConv​github.com一、背景一些轻量级的网络&#xff0c;…

Node.js 得到当前目录下文件修改文件名

博客园第一篇,平时都用 .net ,现在 node.js 比较火&#xff0c;就用它做一些小工具&#xff0c;比较方便 Node.js 得到当前目录下文件修改文件名,把 .txt 修改为.md var fs require(fs); var fileDirectory __dirname if (fs.existsSync(fileDirectory)) {fs.readdir(fileDir…

原来你也在写公众号

现在凌晨1点&#xff0c;我睡不着&#xff0c;因为今天打球了&#xff0c;每次打球回来我总是睡得很奇怪&#xff0c;奇怪有时候打球回来一躺下就睡着了&#xff0c;有时候打球回来就会习惯性失眠。脑海里总是浮现各种打球的进球动作&#xff0c;然后各种幻想&#xff0c;再加上…

中的数组怎么转成结构体_PLC知识,什么是数组和结构体?

今天给大家介绍一下什么是数组&#xff0c;什么是结构体&#xff0c;关于数组我们会介绍数组的定义、它的使用方法&#xff0c;关于结构体我们会介绍结构体的使用、怎么去建立一个结构体等知识&#xff0c;之前也是有部分学员有问过这些问题的&#xff0c;那么都一块儿给大家讲…

MMU那些事儿

最近在重新看这部分知识点&#xff0c;内存管理和进程调度应该是Linux下最核心的两个东西&#xff0c;不管你做得多牛逼了&#xff0c;这两点拿出来讨论&#xff0c;总是会让人眼前一亮&#xff0c;或者是可以讨论很久很久&#xff0c;这篇文章&#xff0c;读完后可能也可以让大…

51Nod 1530 稳定方块

瓦西亚和皮台亚摆放了m个方块。方块被编号为0到m-1(每个号码出现恰好一次)。现在建立一个座标系OX表示地面&#xff0c;OY的方向是竖直向上的。每一方块的左下角有一个座标而且是整点座标。 摆放好的方块一定要是稳定的。稳定的含意是每一个不在地面上的方块在他的下面至少有一…

C语言、嵌入式中几个非常实用的宏技巧

宏打印函数 在我们的嵌入式开发中&#xff0c;使用printf打印一些信息是一种常用的调试手段。但是&#xff0c;在打印的信息量比较多的时候&#xff0c;就比较难知道哪些信息在哪个函数里进行打印。特别是对于异常情况的打印&#xff0c;我们需要快速定位到异常情况的位置。这时…

canvas 多次画图效果_canvas练习之终极的奔跑小人

这次做一个终极的练习&#xff0c;先看一下最后的效果。一个不停奔跑的小人&#xff0c;点击鼠标后会让他跑到目的地&#xff0c;并且呈现不同的角度。下面来看一下如何一步步来实现它的。准备网上下载了一张图片&#xff0c;其中包含了小人面向不同角度奔跑的各个分解动作。新…

loadrunner11安装,提示少了Microsoft Visual c++2005 sp1运行时组件解决办法

解决方法&#xff1a;1、进入loadrunner-11\Additional Components\IDE Add-Ins\MS Visual Studio .NET2、安装&#xff1a;LRVS2005IDEAddInSetup.exe3、再安装loadrunner破解方法&#xff1a;1、把loadrunner相关程序全部退出&#xff1b;2、把lm70.dll、mlr5lprg.dll放到安装…

C语言的爱你永不悔

#前言今天是520节&#xff0c;昨天晚上睡觉的时候&#xff0c;我家地瓜一直说520,520&#xff0c;我不知道要干啥&#xff0c;我就说&#xff0c;要睡就睡&#xff0c;不睡就起来。今天我看了朋友圈&#xff0c;我才知道原来520就是「我爱你」的意思。今天在朋友圈看到的一个小…