STM32F1之485通信

2023-11-14

485与PC通信

准备工作 首先我们需要准备的工具是一根USB-485转接数据线,STM32F103单片机,也可以是其他单片机,思想思路类似。两根公对公杜邦线,为了让板子和转接口连接。
连线工作本人用的485转接器是T/R-接F103单片机B端,T/R+接单片机A端。使用跳线帽将PA2和48R连接,PA3和48T连接。然后连接好串口数据线即可。
程序部分我们使用的是串口2,所以一定要先初始化串口2.

//初始化IO 串口2
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率	  
void RS485_Init(u32 bound)      //串口2定义函数
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
 	NVIC_InitTypeDef NVIC_InitStructure;
 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;				 //PD7端口配置
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出--一定要设置为推挽输出
 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //设置速率为50hz
 	GPIO_Init(GPIOD, &GPIO_InitStructure);     //这个口和硬件的连接有关系,一般不要改,正点原子的485在串口2
	/*
	正点原子的串口2离485RX,485TX最近,所以下面我们初始化串口2 ,让串口2使用跳线帽去连接485RX,TX.
	*/
 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	//PA2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

	RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
	RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位
 
	
 #ifdef EN_USART2_RX		  	//如果使能了接收
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式

  USART_Init(USART2, &USART_InitStructure); ; //初始化串口
  
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
	NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
 
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
   
  USART_Cmd(USART2, ENABLE);                    //使能串口 

 #endif

  RS485_TX_EN=0;			//默认为接收模式
 
}

接下来继续配置串口中断

#ifdef EN_USART2_RX   	//如果使能了接收


//接收缓存区 	
u8 RS485_RX_BUF[64];  	//接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;   		  
 
 

 
void USART2_IRQHandler(void)//串口中断函数
{
	u8 res;	  //设置一个串口数据接收变量  
 
 	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //假设接收到数据
	{	 
	 			 
		res =USART_ReceiveData(USART2); 	//读取接收到的数据,将接收到的数据赋值给res变量
		if(RS485_RX_CNT<64)    //如果接收的数据长度小于64,此时认定为没有接收完
		{
			RS485_RX_BUF[RS485_RX_CNT]=res;		//记录接收到的值
			RS485_RX_CNT++;						//接收数据增加1 
		} 
	}  											 
} 
#endif	

此时基本的串口已经配置结束,需要继续使用接收和发送。

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
	u8 t;
	RS485_TX_EN=1;			//设置为发送模式
  	for(t=0;t<len;t++)		//循环发送数据
	{		   
		while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);	      //等待发送完成,USART_FLAG_TC发送完成标志,置位时表示发送完成
		USART_SendData(USART2,buf[t]);
	}	 
 
	while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);		
	RS485_RX_CNT=0;	  
	RS485_TX_EN=0;				//设置为接收模式	
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)//数组通过首地址来读取,len是一个指针,*len表示这个指针所代表的值,传入后可以对参数修改
{
	u8 rxlen=RS485_RX_CNT;//CNT的值在中断服务函数里,表示收到的数据个数,这个时候,数据已经在中断RS485_RX_BUF[]存储上了
	u8 i=0;
	*len=0;				//默认为0
	delay_ms(10);		//等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
	if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
	{
		for(i=0;i<rxlen;i++)
		{
			buf[i]=RS485_RX_BUF[i];	//将中断函数中的缓存按位发到buf[i]
		}		
		*len=RS485_RX_CNT;	//记录本次数据长度
		RS485_RX_CNT=0;		//清零
	}
}

此时整个串口就可以使用了,我们只需要在主函数调用即可收发了。
//测试========
【当PC的串口助手为主机,F103为从机】
实现功能:PC串口助手发送------F103屏幕显示。
我们采用串口助手,波特率和代码必须一致4800【代码设置的是4800】,切记一定要点HEX发送,不然不会出现屏幕显示和发送内容一致。(原因如下)

常见的转换的函数用 itoa strtoul strtol atoi atof。多个字节转化要使用移位,取反等操作。还搞不清这个概念也真是丢脸。
首先,底层的数据传输都是字节流,所以不管选择什么方式,都会被分解为一个一个的字节。
1、选择Hex发送就代表你要发送的内容是纯数字,由程序完成String到Int再到Byte的转化。所以你应该保证每个你要发送的数都是两位的,如果是7就应该写07,因为程序会每两位每两位地读。如果你选择了Hex发送,而输入的又是字符,比如你写了ab,那么就会被程序读为16进制的AB。这就是不同的概念了,无论你选择什么方式显示都不能得到原来的ab了。
2、选择ASCII发送就代表你要发送的是字符串,这时候程序就会一位一位地读,比如你写了1234,在字节流中传递的就是123对应的ASCII码,31,32,33,34(十六进制的)。比较而言,在Hex发送模式下,写了1234,会被发送的就是12,34,如果是01020304那就是01,02,03,04。这个时候,你写ab就会发送相应的ASCII码61,62,其他字符同理。
到这里,数据已经发送出去了,接下来就是显示的问题。是显示模式,不是解析,不存在解析。
3、选择Hex显示就是把字节转化为16进制整型,你收到的是12,34,就显示为12,34,你收到31,32,33,34,也显示为31,32,33,34,如果收到AB呢,那也是AB。
4、选择ASCII显示呢,就会把你接收到的十六进制转化为对应的字符,比如你收到了31,就会显示为1。这种模式下可能会出现乱码,原因就是ASCII码只从0-7f。如果你在十六进制发送模式下发送了字符,比如发送了ab,那你就会收到AB,这个并没有ASCII码对应的字符。
所以在Hex模式下如果输入字符,是无论如何接收不到正确的数据的,其他方式那就随意了。重要的是,方式的选择改变的不是数据本身,而是数据的表现形式。
PC端发送
单片机接收
当我们以F103为发送端时候,USB转485的连接PC【使用USB串口助手为接收端】,
实现功能:F103代码写入一个数据数组,并且在LCD屏幕显示,当烧入代码后,打开串口调试助手,观察USB-485的串口接收数据是否和发送端一致。
PC端接收

单片机进行接收
基本到这所有的数据收发已经完成,有需要帮助调试源码的小伙伴留下联系方式,可帮助进行调试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F1之485通信 的相关文章

  • Linux常见命令

    ifconfig 查看ip vi filename 打开或新建文件 并将光标置于第一行首 mkdir dir1 创建一个叫做 dir1 的目录 mkdir dir1 dir2 同时创建两个目录 rm f file1 删除一个叫做 file1
  • 两个二维数组合并

  • 重磅发布

    导语 后疫情时代 随着各行业线下业务与线上业务的深度结合转型 流量思维的增量导向逐渐转向降本增效 虚假流量已经成为互联网时代信息化数字资产最大的威胁之一 据极验最新行业数据统计 各个行业都有较高比例的虚假流量存在 机器流量最为泛滥的区块链行

随机推荐

  • Flutter实现类似Android中的PopupWindow控件

    最近在网上看到一段话 产品有三宝 弹窗 浮层加引导 设计有三宝 透明 阴影加圆角 运营有三宝 短信 push加红包 在日常开发中经常会遇到弹窗 浮层之类的效果 这些在Android中实现很简单 可以用PopupWindow完成 但是在flu
  • 静态映射和动态映射

    1 为什么需要映射 在内核启动过程中会开启MMU 建立虚拟映射表 以后内核使用的都是虚拟地址 但是我们查询数据手册得到I O寄存器地址都是物理地址 于是需要将物理地址转换到虚拟地址 这样才能在内核空间去访问I O寄存器 物理地址转换到虚拟地
  • Linux下配置pptp协议之拨号上网

    首先安装pptp sodo apt get install pptp linux y 创建连接 sudo pptpsetup create nodeName server yourServerAddr username xxx passwo
  • zookeeper的安装部署

    1安装zookeeper集群 上传安装包 移动到指定文件夹 mv zookeeper 3 4 6 tar gz opt apps 3 解压 tar zxvf zookeeper 3 4 6 tar gz 4 修改配置文件 1 进入到conf
  • Git介绍及常用命令

    Git介绍及常用命令 在软件开发过程中 团队协作基本上都会使用到git git可以使得团队开发效率变高 因此 我们接下来介绍git的使用方法 国内一般使用gitee 当然 也可以使用github github是国外的 所以加载慢 甚至加载不
  • SQL知识整理三:变量、全局变量、视图、事务、异常

    SQL知识整理三 变量 全局变量 视图 事务 异常 参考文章 1 SQL知识整理三 变量 全局变量 视图 事务 异常 2 https www cnblogs com chengxingliang p 3333277 html 备忘一下
  • 【马普所2008】机器学习中的核方法(上)

    Hofmann T Sch Lkopf B Smola A J Kernel methods in machine learning J Annals of Stats 2008 36 3 1 Integrating structured
  • Spring的事务隔离级别

    Spring的事务隔离级别是用于控制事务并发访问数据库时的行为 Spring框架提供了五个事务隔离级别 分别是 1 DEFAULT 默认 使用数据库默认的事务隔离级别 在大多数情况下 这等同于使用READ COMMITTED级别 2 REA
  • 使用纯java ssh方式连接linux服务器,并用此方式部署war到linux的tomcat下

    b 纯java代码使用ssh方式登录linux服务 实际应用中 可以使用这种方式上传部署web工程war包 并且部署启动tomcat 一个自动化完成所有工作 起到节省时间作用 1 去 url http www jcraft com jsch
  • QIIME2-DADA2&Deblur

    Deblur使用序列错误配置文件将错误的序列与从其来源的真实生物序列相关联 从而得到高质量的序列变异数据 主要为两个步骤 DADA2 质控 汇总版 qiime dada2 denoise single i demultiplexed seq
  • notepad 自动换行 分屏 快捷键

    一 自动换行 视图 gt 自动换行 二 分屏 Tab标签 上方文件名 右键 gt 移动到另一视图 三 快捷键 快速复制 Ctrl D 区块注释 Ctrl Shift Q 保存所有打开文件 Ctrl Shift S 行注释 Ctrl K 取消
  • 内卷化时代,一名普通测试员的铁饭碗究竟是什么?

    内卷 是现在热度非常高的一个词汇 随着热度不断攀升 隐隐有了 万物皆可卷 的程度 究其来源 内卷这个词的出现 是伴随着996开始讨论的 很不幸 996 福报等等这些词的重灾区和源头就是计算机 互联网行业 那么作为行业中一个非常重要的分支 测
  • web前端模块化框架,一句代码让html可直接引入别的html文件

    web前端模块化框架 介绍 一个web前端模块化框架 可以引入模板html文件 利于前后端分离的网站重复代码以及模块的复用 软件架构 本框架是利用mloader js文件加载带有mloader template的类的标签从而进行的文档的动态
  • 基于Keil创建汇编语言的STM32工程

    本文是在Keil嵌入式开发环境下完成一个基于STM32汇编程序的编写 学习在没有硬件条件下进行仿真调试 观察ARM寄存器的变化状况 记录过程生成的 hex文件各段的大小 了解Hex文件格式及其前8个字节内容含义 文章目录 一 新建工程 二
  • 建立双机调试

    1 首先你得有一个VMware 我这里是VM10 主机是64windows操作系统 2 我在虚拟机中装了32 位win7 3 下载 VirtualKD 我预先放在百度云盘的资源 https pan baidu com s 1eRD4AR4
  • C# 系统应用之无标题窗体移动的两种方法

    在做项目界面设计中 常常为了美观需要设置窗体属性 FormBorderStyle 窗体边框和标题栏外观 为None无标题窗口 此时隐藏标题的窗口怎样实现移动呢 我根据自己的项目从自己完成的两种方法进行讲解 一 MouseDown Mouse
  • TypeScript的类型推导

    TypeScript 简称ts 是一种静态类型的编程语言 在类型检查和类型推导方面具有一定的优势 类型推导是TypeScript在代码编写的过程中自动识别并设置变量类型 从而提高代码的可读性和健壮性 减少了代码中潜在的错误 在 TypeSc
  • 编译原理实验一:词法分析

    实验一 词法分析程序 一 实验目的 通过设计编制调试一个具体的词法分析程序 加深对词法分析原理的理解 并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法 编制一个读单词过程 从输入的源程序中 识别出各个具有独立意义的
  • 网络入门基础(网络布线)

    目录 前言 一 布线系统 1 工作区子系统 2 水平子系统 3 垂直子系统 4 管理子系统 5 设备间子系统 6 建筑群子系统 二 布线材料 1 线槽 2 桥架 走线架 3 配线架 三 网络机柜 四 网络布线 1 需求分析与走线设计 2 估
  • STM32F1之485通信

    485与PC通信 准备工作 首先我们需要准备的工具是一根USB 485转接数据线 STM32F103单片机 也可以是其他单片机 思想思路类似 两根公对公杜邦线 为了让板子和转接口连接 连线工作本人用的485转接器是T R 接F103单片机B