STM32L011K4 uart串口多机通信 的问题
   本人在使用stm32L0114K做多机通信,一个主机给多个从机通过串口发消息,因此从机的串口需要被配置成不同的地址,并且使用静默模式。然后问题来了。
 手册上说设置为静默模式,需要把RQR寄存器中的MMRQ位置1,但是无论怎么写,这位都没有被写成1,一直是0,所以现在很困惑。
 不知道是自己配置有误,还是寄存器那位禁止这样的写操作(但是我并没有在手册上看到)?

2个回答

本人在使用stm32L0114K做多机通信,一个主机给多个从机通过串口发消息,因此从机的串口需要被配置成不同的地址,并且使用静默模式。然后问题来了。
手册上说设置为静默模式,需要把RQR寄存器中的MMRQ位置1,但是无论怎么写,这位都没有被写成1,一直是0,所以现在很困惑。
不知道是自己配置有误,还是寄存器那位禁止这样的写操作(但是我并没有在手册上看到)?
后面会贴代码,十分渴望各位朋友们给我进行些点播,谢谢大家!

这个代码就是测试RQR寄存器中的MMRQ位是否为1,但是它就是不为1:
int main(void)
{

HAL_Init();

/* Configure the system clock to 2 MHz /
SystemClock_Config();
/
¾²Ä¬Ä£Ê½ */

/* Configure LED3 */
BSP_LED_Init(LED3);

/*##-1- Configure the UART peripheral ######################################*/
/* Put the USART peripheral in the Asynchronous mode (UART Mode) /
/
UART configured as follows:
- Word Length = 8 Bits
- Stop Bit = One Stop bit
- Parity = None
- BaudRate = 9600 baud
- Hardware flow control disabled (RTS and CTS signals) */
UartHandle.Instance = USARTx;

UartHandle.Init.BaudRate = 9600;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;
UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_MultiProcessor_Init(&UartHandle, 1, UART_WAKEUPMETHOD_ADDRESSMARK) != HAL_OK) //给串口配置地址
{
Error_Handler();
}
HAL_MultiProcessorEx_AddressLength_Set(&UartHandle, UART_ADDRESS_DETECT_7B); //串口地址长度
HAL_MultiProcessor_EnableMuteMode(&UartHandle); //串口使能静默模式
HAL_MultiProcessor_EnterMuteMode(&UartHandle); //串口进入静默模式,就是把MMRQ设为1(这个的具体代码贴在后面)
if(HAL_UART_DeInit(&UartHandle) != HAL_OK)
{
Error_Handler();
}

if(HAL_UART_Init(&UartHandle) != HAL_OK)
{
Error_Handler();
}

     if((USART2->RQR &UART_MUTE_MODE_REQUEST) == 0)  //这里仅仅想判断一下寄存器这位数据是不是已经被赋值为1了,但是并没有
 {
      BSP_LED_On(LED3);
      HAL_Delay(1000);
      BSP_LED_Off(LED3);
      HAL_Delay(1000);
      BSP_LED_On(LED3);
      HAL_Delay(1000);
      BSP_LED_Off(LED3);
 }
 else
     BSP_LED_On(LED3);
    }

/*开始静默模式,即给RQR寄存器的MMRQ位写入1*/
void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart)
{
__HAL_UART_SEND_REQ(huart, UART_MUTE_MODE_REQUEST);
}

如果有朋友有类似的经验,求解惑啊!

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
串口多机通信
串口多机通信学习 一、51单片机的主从模式,首先要设定工作方式3:(主从模式+波特率可变) SCON串口功能寄存器:SM0=1;SM1=1(工作方式3) 注:主机和从机都要为工作方式3。 工作方式2 (SM0 SM1 :1 0):串行口为11位异步通信接口。发送或接收一帧信息包括1位起始位“0”、8位数据位、1位可编程位、1位停止位“1”。发送数据:发送前,先根据通信协议由软件设置TB...
串口多机通信问题
我使用单片机lpc932,采用他的地址自动识别功能,从机无法进入中断。调试中没有设置SADDR、SADEN值,采用方式3,置位SM2,来访问从机也无法产生中断。之后我只是把从机程序的SM2置0,其他没有变化,就可以进入中断,但是仿真发现RB8接受到值。(在主程序中TB8已置1)rn下面是我从机设置rnrn P1M1=0X00;rn P1M2=0X00;rnrnrn BRGCON=0X00;rn BRGR1=0X02; //波特率设置rn BRGR0=0X61;rn BRGCON=0X03;rn rnrn SADDR=0xC1; //一号机地址rn SADEN=0XFE;rnrn SCON=0Xf0; //串口工作方式3,允许接收, SM2=1rn SSTAT=0X00; //接收与发送中断分开rn PCON=0X00; //SMOD0=1rnrn TMOD=0X01;rn TH0=0X15;rn TL0=0X9f;rn ET0=1;rn //TR0=1;rn ES=1;rn EA=1;rn
单片机串口多机通信
单片机串口多机通信Protues仿真源代码,采用keil编程
多机通信问题
我目前在做一个ARM处理器(S3C4510)和多个单片机(AT2051)通过串口通信的程序,多机通信先发地址后发数据,发地址必须使第9rnrn位信息为1,发数据必须使第9位为0;rn顺便说一下:S3C4510(uClinux)和AT2051通信是可以建立起来的.rn发地址前:rnstruct termios opt;rnopt.c_cflag = BAUDRATE | CS8 | PARENB | PARODD | CMSPAR | CLOCAL | CREAD; rnopt.c_iflag = (INPCK | IGNBRK | IGNPAR);rn发数据前:rnstruct termios opt;rnopt.c_cflag = BAUDRATE | CS8 | PARENB | CMSPAR | CLOCAL | CREAD; rnopt.c_cflag &= ~PARODD;rn我目前是想做一个简单的测试程序:rn我在发地址前:rn设置好BAUDRATE,数据位8位,奇校验,一个停止位rn发数据前:rn设置好BAUDRATE,数据位8位,偶校验,一个停止位rn可是通讯建立不起来,不知道该如何做,请高人指点!谢谢!
UART的同步通信和异步通信,通信方式,多机通信,流控
    大致对UART做了一个简单的整理。 异步通信: 同步通信:   串行的单工,半双工,全双工: 串口的多机通信:     UART的RTS, CTS: 一、流控,顾名思义就是流量控制的意思。目的是协调收发双方,使数据不会丢失。 二、很多人用了串口很久都不知道这回事,这是因为很多场合确实没有必要。收发双方波特率固定,并且接受数组足够大,这时不会出现接收方...
串口多机通信pc机的发送数据问题!!!
为了实现与单片机的多机通信,我们使用地址标识,也就是在发送地址字节的时候校验位为M,在发送数据字节的时候为S,这样一来我们如何去发送数据呢!rn我首先是设置校验位为m发送地址字节,然后在去设置校验位为s发送数据,这样正确吗?rnrn当我们接受数据时,如果单片机也是按照这种方式给我发送数据我怎么处理呢!rn因为在调试的时候,事件的返回值为1009也就是校验位出错,我应该怎么去做呢!
c#串口调试程序+485多机通信
1.c#串口调试软件(带原程序)。 2.压缩文件里包括c#串口调试软件,KEIL程序(计数器),proteus仿真485多机通信。 3.使用上位机软件读取485网的计数器数据,非常好的整套系统程序(适用初学c#,单片机)。 4.需要安装虚拟串口,framework3.5,proteus7.7,keil等。 5.如有问题请回复,我会尽量答复的。
51多机通信串口协议程序
51单片机的多机通信协议 包含五个方向的数据传输
求解串口多机通信设置
以下是本人写的程序,可是好像感觉在校验时不对,还请各种江湖豪杰指教,谢谢!rn/*题目:*/ rn/*多机通信 主机程序*/rn#includern#define uchar unsigned charrn#define uint unsigned intrnrnuchar cs,adj,num,tyz,ryz;rnrnuchar code table[]=rn0x3f,0x06,0x5b,0x4f,rn0x66,0x6d,0x7d,0x07,rn0x7f,0x6f,0x77,0x7c,rn0x39,0x5e,0x79,0x71,rn;rnrnsbit key=P3^7;rnsbit d1=P1^0;rnvoid init();rnvoid delay(uint z)rnrn uint x,y;rn for(x=z;x>0;x--)rn for(y=110;y>0;y--); rnrnvoid main()rnrn init();rn while(1)rn rn ES=0;rn P3=0xff;rn key=1;rn if(key==0)rn rn delay(20);rn if(key==0)rn rn num++;rn if(num==255)rn num=0;rn P1=num;rn SBUF=num;rn rn while(!key);rn delay(20);rn while(!key);rn ES=1;rn rn elsern rn P1=0xff;rn rn rn rnrnrnrnvoid init()rnrn// num=0x11;rn adj=0x0f; //主机地址rn TMOD=0x20;rn TH1=0xFD;rn TH1=0xFD;rn EA=1;rn TR1=1;rn SM0=1;rn SM1=1;rn// SM2=1; rn REN=1;rn ES=1;rnrnrnvoid scon() interrupt 4rnrn TB8=1; //先置位rn SBUF=adj; //当 A 机开始发送时,先送一个adj信号给B机rn while(!TI); //发送地址帧rn TI=0; rn/******以上为接收*******/ rn while(!RI); //接收返回来的地址帧进行比较核对无误,通知从机进行一对一数据通信rn RI=0; rn if(RB8==1)rn rn tyz=adj^0x0F; //字节异或rn tyz=adj+tyz;rn ryz=SBUF; //接收验证码rn if(ryz==tyz)rn rn SBUF=0x00; //若正确则回送正确信号00Hrn while(!TI);rn TI=0;rn rn elsern rn SBUF=0xFF; //若校验和出错,则发送0FFH,命令该从机重发数据rn while(!TI);rn TI=0; rn rn rn elsern rn SBUF=adj; //若接收帧的RB8=0,则存数据到缓冲区,并准备接收下帧信息rn rn/******以上为核对地址帧核对无误,通知从机进行一对一数据通信*******/rn rn // while(!RI);rn // RI=0;rn if(SBUF==adj)rn rn RB8=0;rn SBUF=num;rn while(!TI);rn TI=0;rn rn elsern rn TB8=1;rn SBUF=0x00; //复位信号rn while(!TI);rn TI=0;rn rn///////////////////////////////////////////////////////////////////////////////////////////////////////////rn/*题目:*/ rn/*多机通信 从机程序*/rn#includern#define uchar unsigned charrn#define uint unsigned intrnrnuchar bdj,zs,num,ryz;rnrnvoid init();rnrnvoid main()rnrn init();rn while(1)rn rn rn rn rn rnrnrnvoid init()rnrn// num=0xaa;rn bdj=0x55; //从机地址rn TMOD=0x20;rn TH1=0xFD;rn TH1=0xFD;rn EA=1;rn TR1=1;rn SM0=1;rn SM1=1;rn SM2=1; //多机通信控制位,此时处于接收地址帧状态rn REN=1;rn ES=1;rnrnrnvoid scon() interrupt 4rnrn RB8=1;rn while(!RI);rn RI=0;rn zs=SBUF; //收到主机发出来的地址帧rn if(zs==bdj) //接收进来的地址与本机进行比较rn rn SM2=0; //如果相等,将SM2置0可进行双机通信,否则SM2保持 rn SBUF=bdj; //回答一个bdj信号给A机rn while(!TI); //比较后相等,则用本机地址应答给主机,让主机确认rn TI=0; rn rn/*************以上为接收主机发来的地址帧并核对后,向主机返回本从机地址*******************/ rnrn ryz=bdj^0x0F; //字节异或rn SBUF=bdj+ryz; //附加到数据块末尾rn TB8=1;rn while(!TI);rn TI=0;rn // while(!RI);rn // RI=0;rn if(SBUF==0x00) //从机收到复位命令后回到监听地址状态rn SM2=1; //(SM2=1)rn else //否则开始接收数据和命令rn rn while(!RI);rn RI=0;rn num=SBUF;rn P1=num;rn rnrnrnrn
020单片机串口多机通信程序
本程序在C8051F020单片机上通过串口进行多机通信,主机和从机之间可以安全可靠地传输数据,程序已在020单片机上调试成功。
51串口多机通信源码
协议改为,主机发起通信时,先发送0x19作为发送地址的准备,而后发送地址 主机发起通信时,从机处于监听状态,若与本机地址相符,开始通信 从机发起通信,先发送0x91,而后发送自身地址,在开始发送请求或数据
s5pv210——串口(UART)通信实战
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。 参考博客http://www.cnblogs.com/biaohc/p/6351253.html   一、主要代码总览 void main(void) { uart_init(); while(1) { uart_putc('a'); delay(); } } #define GPA0CON 0xE02...
winsock多机通信问题!!!!
一个服务器端,n个客户端,怎样让服务器端对应向连接的客户端发送数据?rn 比如现在n台客户端已经连接到服务器端,我想要向第10台发数据,(这其中的客户端IP有可能相同)!就象聊天室中的私聊一样!
lwip多机通信问题
1、多级通信会存在 抢资源的问题, 2、对核心资源的管理问题,即如何实现互斥操作的问题
UART多串口扩展器的应用
介绍UART多串口扩展器SP2337,该器件可将现有的单串口单片机扩展为全新的具有3个串口的单片机。给出该器件的性能、引脚功能及应用,并给出将AT89C51单片机的单串口扩展为三个UART串口的硬件电路及相应程序。
基于单片机的串口多机通信(6机)
原创。利用单片机串口完成6机简单通信;可挂接更多从机,最多255台。包含Keil C设计源程序及Proteus仿真。
基于串口方式一的pc机与单片机的多机通信
基于串口方式一的pc机与单片机的多机通信
51单片机多机通信
这里面是以三机通信为基础的程序,其中里面有仿真,很简单,易理解,功能已实现。
8051F040SMBUS多机通信
8051F040SMBUS多机通信包括SMBUS的总线设计及程序的详细设计与实现,8051F040的smbus与I2c兼容
单片机的多机通信
单片机的多机通信
SPI多机通信
我现在想用两台单片机上进行SPI的多机通信,可收发,用到四根线SDO,SDI,EN,SCK、rnrn我是这样进行假设的、rnrn主机发送一个数据的8位、每个时钟上升沿开始发送数据、8个时钟后数据发送完毕rnrn从机的话是如何进行接收的呢?(主机发送的8位数据不可能是全部存在了SDO上面的吧)、那么从机是检测每来一个时钟进行一次数据的存储了吗?那这样的话,从机的sck线是不是要设为输入状态了呢?rnrn感觉发送很容易rnrn[code=c]void send(unsigned char date)rnrn en=1;rn _delay(10);rn en-0;rn sck=0;rn for(int i=0;i<8;i++)rn rn sdo=date&0x80;rn sck=1;rn _delay(10);rn date<<=1;rn sck=0;rn rn[/code]rnrn上面是我写帖子时顺手写下的发送函数,要是主机以这样的方式发送出去的话、从机应该如何接收?rnrn了解的人,请帮助帮助、谢谢了
RS-485的多机通信
单片机多机通信(C程序)源码仅供参考学习用。
max485多机通信
本文件是C51 编写的 max485多机通信 程序,带有PROTUES 仿真文件
485多机通信
用C写的51单片机的RS485多机通信程序。
ROS:多机通信
背景 ROS的特殊通信机制使得其能够满足多机之间的通信。本博客主要记录进行多机通信的操作流程。 1. 环境准备 所有的电脑都必须安装同一版本的ros系统,且处于同一个局域网下。可以通过 ifconfig来查询当前电脑的IP地址;可以通过ping来确诊多个电脑是否属于同一个局域网下。 在本文博客中,假设总共有两台电脑A,B,并选用A作为主节点。 通过ifconfig命令,分别查询...
tcp 多机通信
有一台机S,用asp.net做了一个网站,网站通过tcp与另一台机D的6000端口通信,不停扫描D返回的数据,控制D操作。rn另有一台机A通过访问S上的网站,通过页面实现对D的操作。rn现在的问题是:我在A机连上页面操作D时,另一台机B虽然打开了S上的网站页面,却显示没有连接上D机,也就无法实现对D机的操控了。rn请问可以做到多机通过S上的网站操控D机吗?如果可以应当怎样做?谢谢!
ROS多机通信
多级通信的前提是在同一局域网下。 笔者使用的多级通信的一个靶机是树莓派,一个是个人pc。 注意在使用虚拟机时,一定要采用桥式连接,否则虚拟机的IP是虚假ip,不能进行通信,其实ping也不会ping通。 连接树莓派: ssh 用户名@树莓派ip 多机通信: 在当前机器下,操作另一台机器的结点,首先,导出ip export ROS_IP=目标Ip export ROS_MAS
NRF多机通信
最近在接了一个项目,要求各个设备能够联网(不是互联网)控制。NRF24L01刚好有这个功能。但是之前只做过一对一的通信,还是用例程的那一种。我在想,用两个地址,共用同一个通道应该也可以完成。后来他又要求发过去的数据还要能回传,这下我只好来研究多通道通信了。多机通信和一对一通信基本上相同,就是要配置其他通道的地址和使能其他通道的有效数据宽度,还有自动应答。这是接收机的:void NRF24L01_In
AT24C02多机通信
基于AT24C02的多机通信
8051F040芯片UART多机通信的设计与实现
8051F040芯片UART多机通信的设计与实现,包括总线的设计,及软件的详细设计与实现,对上层提供统一接口,供上层调用。因为UART只能是主从模式,所以必须将某个芯片设置成主机端,其它芯片设置成从设备端,压缩文件里有设计文档,及主设备(uartmaster)和从设备(uartslave)的程序。
多机通信程序多机通信程序
上位机发来的命令字数据召唤命令字收到PC机命令后的处理程序串行通信接收程序 ;选择工作寄存器组为第一组 ;A:接收数据暂存 ;R7:接收数据指针 ;R6:接收数据的长度 ;R0:接收数据缓存区指针
rs232 多串口 通信
1,实现三路数据同时接收 2,程序完整 3,VB编写,结合网络上多种方案
串口实验之多机通信
stm32串口通信实现多机通信,这是一个主机代码,从机代码可在此基础上进行修改。从机通过开发板上的按键选择要通信的主机。
单片机多机通信(串口)
单片机多机通信,采用的是串口连接,定时计数器的合理运用。文件是main主函数。
rs485多机通信 Proteus
rs485多机通信,基于Proteus的,很生动详细,,看了就明白
8051多机I2C通信
8051系列单片机多机I2C通信代码,带仿真文件。
485多机通信程序
485多机通信程序(主机模式),Modbus 通讯协议。
rs485多机通信程序
rs485多机通信程序,包括主机和从机的代码。
ATMEGAL64的485多机通信
本资料是基于ATMEGA64的485多机通信,很详尽的485设置还有不同的通信写法等
iic总线的多机通信例程
基于IIC总线的多机通信例程,以8051单片机为平台进行
相关热词 c# stream 复制 android c# c#监测窗口句柄 c# md5 引用 c# 判断tabtip 自己写个浏览器程序c# c# 字符串变成整数数组 c#语言编程写出一个方法 c# 转盘抽奖 c#选中treeview