imx6 配置串口波特率_RS232串口多机通信
一、基本原理
1、主从多机通信拓扑图
2、主从多机通信的具体过程
1)使所有的从机的SM2位置1,以便接收主机发来的地址;
2)主机发出一帧地址信息,其中包括8位需要与之通信的从机地址,第9位为1;
3)所有从机接收到地址帧后,各自将所接收到的地址与本机地址比较,对于地址相同的从机,使SM2位清零以接收主机随后发来的所有信息。对于地址不符合的从机,仍保持SM2=1的状态,对主机随后发来的数据不予理睬,直至发送新的地址帧;
4)主机给已被寻址的从机发送控制命令和数据(数据帧的第9位为0);
5)本次通信结束后,从机重置SM2=1,主机可再寻址其它从机。
二、主从模式
首先要设定工作方式3:(主从模式+波特率可变)
SCON位定义:
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)其发送帧结构为:
主机的配置,及相关程序为:
//主机为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的文章,记得关注和点赞哦!】
imx6 配置串口波特率_RS232串口多机通信相关推荐
- java 串口波特率_JAVA串口通信的方法
以前经常用C语言操作串口,实现一些发送接收之类的小功能,最近项目中也用到了串口通信,不过语言变成了Java,这个搞起来略蛋疼. Java说起来就是各种库各种引用,所以得到某些需求先google搜一把~ ...
- c 语言 如何设置串口波特率,STC89C52RC串口波特率程序
一.完整代码如下:C #include#define uchar unsigned char #define uint unsigned int void send(uchar state) { SB ...
- linux 串口波特率失败,串口上不常见的波特率 - Linux
我正在尝试制作一个程序来读取串口.在这个端口上,我收到波特率为875000的数据.这种情况并不常见,我没有成功修改它.我做了一个小C程序来做到这一点,但它不适用于875000 ...这里的代码的一部分 ...
- 485多机通信c语言编程,RS-485多从机竞争的解决方案
摘要:本文介绍的新方案之一能够识别从机发送信号的时间顺序,先发送的从机信号可以同时抑制其他从机的RS-485发送信号,只有等先发送信号的从机发送完毕之后其它从机才能够发送RS-485信号.本文介绍的新 ...
- imx6 配置串口波特率_stm32异步串口(uart)通讯基本操作
| 串口是一种全双工通讯方式 单工 数据传输只支持数据在一个方向上传输 半双工 允许数据在两个方向上传输,在同一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信 全双工 允许数据同时 ...
- mfc如何将一个数组中的字节数据用串口发送出去_RS232串口多机通信
一.基本原理 1.主从多机通信拓扑图 2.主从多机通信的具体过程 1)使所有的从机的SM2位置1,以便接收主机发来的地址: 2)主机发出一帧地址信息,其中包括8位需要与之通信的从机地址,第9位为1: ...
- 51单片机之串口波特率配置
51单片机之串口波特率计算 方式0的波特率配置 方式2的波特率配置 方式1和3的波特率配置 232串口模式,共有4钟方式,其中方式0.方式2的波特率是固定的.方式1.方式3的是可变波特率,这两个是用T ...
- proteus中使用虚拟串口实现单片机和上位机通讯
祝大家身体健康哈,肺炎愈来愈多,希望看到这篇文章的旁友都能健健康康! 今天写一下proteus里如何使用虚拟串口仿真单片机和上位机通讯,所需要的软件有:(1)Virtual Serial Port D ...
- 计算机的串口波特率,什么是波特率_波特率9600是什么意思_串口通信为什么要设置波特率?...
描述 波特率(Baud Rate) 单位 bps -- 每秒传送的字节数 Byte Per Second.. (BaudRate) 模拟线路信号的速率,也称调制速率,以波形每秒的振荡数来衡量.如果数据 ...
最新文章
- python内置库之学习ctypes库(二)
- linux mysql cpu 查看工具_Shell编程检测监控MySQL的CPU占用率
- Tomcat中的Session小结
- FLASH模仿苹果菜单源码.(AS苹果菜单源码)
- ds哈希查找—二次探测再散列_大白话之哈希表和哈希算法
- Android官方开发文档Training系列课程中文版:通过NFC共享文件之从其它设备接收文件
- python数据分析_使用Python进行数据分析
- 测试管理 | 4种优先级排序方法一定要掌握
- 再谈用MFC实现文件拖放到编辑框
- Kubernates和Docker
- [Erlang 0017]Erlang/OTP基础模块 proc_lib
- 企业申请CMMI3-CMMI5必经的六个阶段
- 3d打印实用小工具--GCode Viewer在线预览GCODE文件
- dpdk Ipv4组包逻辑解析
- 【转载】国医大师熊继柏:用中医思维彻底把新冠病毒中医治疗方案说清楚!值得中医人收藏
- 北大哲学系杨立华先生
- 如何用Python做日历?
- 这个男人用8幅画刻画“父爱”,被暖化了
- 人工智能机器学习入门资料免费送
- Steam帝国时代3完全版,每次启动UAC