基于STM32F0的485通信

背景:项目需要,通过485,将数据发送到总线上。(STM32F0是没有485接口的)

485介绍:半双工(必须要有引脚来控制收发)

485模块驱动测试方案:通过 USB—>485——485—>TTL ,实现电脑和STM32FO进行发收以测试是否正确。

#define TX_485 GPIO_SetBits(GPIOA,GPIO_Pin_1)   //high level, transmitter input
#define RX_485 GPIO_ResetBits(GPIOA,GPIO_Pin_1)

uint8_t dat;

void USART_rs485_2_Init()
{
 USART_InitTypeDef USART_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;  //控制引脚
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure USART Tx as alternate function push-pull */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* Configure USART Rx as alternate function push-pull */
 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
 GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_PinAFConfig(GPIOA, GPIO_PinSource2,GPIO_AF_1);
 GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);

USART_InitStructure.USART_BaudRate = 9600;
 USART_InitStructure.USART_WordLength = USART_WordLength_8b;
 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);

/* Enable the USARTx Interrupt */
 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);

USART_ClearFlag(USART2,USART_FLAG_TC);
 USART_ITConfig(USART2, USART_IT_RXNE,ENABLE);    //open usart interrupt

/* Enable USART */
 USART_Cmd(USART2, ENABLE);
}

void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2, USART_IT_RXNE))

  {
    dat = USART_ReceiveData(USART2);
    RS485_Send_Data();

  }
  USART_ClearFlag(USART2,USART_FLAG_RXNE);

}

void RS485_Send_Data()
{
  TX_485;
  delay_ms(1);
  USART_SendData(USART2,dat);
  delay_ms(1);
  RX_485;
}

此次项目应用中,使用的485相关代码

//在普通串口已经初始化好的前提下,增加如下的控制引脚,就实现了485模块发送。

#define TX_485 GPIO_SetBits(GPIOA,GPIO_Pin_1)   //high level, transmitter input
#define RX_485 GPIO_ResetBits(GPIOA,GPIO_Pin_1)

void USART2_rs485_Init() 
{
   GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_Init(GPIOA, &GPIO_InitStructure);

}

//这是485发送函数
void RS485_Send_Data(uint8_t data)
{

  TX_485;
  delay_ms(1);
  USART_SendData(USART2,data);
  delay_ms(1);

  RX_485;
}

时间: 2024-10-21 01:36:44

基于STM32F0的485通信的相关文章

基于Spring支持的通信

概述 基于Spring支持的客户端编程,包括发送方客户端.接收方客户端. 发送方客户端代码:jms-producer 接收方客户端代码:jms-consumer 本文有pdf版本:基于Spring支持的通信.pdf 发送方客户端 这里基于demo进行说明.这个demo将往example.queue和example.topic各发一条信息. 文件目录结构 1 src/main/resources/ 2 |---- jndi.properties 3 |---- spring-beans.xml 4

php 基于socket的基本通信

php 基于socket的基本通信 1.前言 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议. 这种介绍度娘很多,希望了解更多的自行百度,往下看的朋友记得先开启socket扩展: 2.创建socke服务器端 基本步骤: 初始化86socket 端口绑定 端口进行监听 调用accept阻塞

JAVA基础知识之网络编程——-基于UDP协议的通信例子

UDP是一种不可靠的协议,它在通信两端各建立一个socket,这两个socket不会建立持久的通信连接,只会单方面向对方发送数据,不检查发送结果. java中基于UDP协议的通信使用DatagramSocket类的receive和send方法即可,但消息需要通过一个特定的类封装(DatagramPacket) 下面是一个基于UDP协议的通信的例子, 服务器端, 1 package udp; 2 3 import java.io.IOException; 4 import java.net.Dat

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

recv原理、高阶版黏包解决方案、基于UDP的socket通信

recv原理.高阶版黏包解决方案.基于UDP的socket通信 recv原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the optional flags argument, see the Unix manual. 对于这些设置的参数,可以查看Unix手册. When no data is available, block untilat least one byte is av

485通信总结

1.485是半双工的通信总线,在通信时要保证收发时序不冲突.同向时序不冲突. 2.485的匹配电阻分置在两端,当多个器件连接在485总线上时,只有最远端的器件添加有匹配电阻,增减器件时要保证包含匹配电阻的器件在通信总线上的完整性. 3.使用串口485时,485之间的信号是差分信号,485与串口通信时TTL信号,485的优点是保证两485芯片之间的差分信号能过远距离传输.传输速率取决于距离.485芯片.匹配电阻.以及串口速率(当基于串口通信时)等.

基于android的Socket通信

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

Android开发之网络请求通信专题(一):基于HttpURLConnection的请求通信

在Android开发中,网络请求必然是必不可少.一般而言,都是基于http的网络请求.有时候也会有SOCKET请求,这个后续的专题再讲.今天,我们就先讲讲常用的Http请求. http求情自然是遵循http协议的,相关内容请转接:Java学习笔记之Http协议详解 好了,开始今天的正题. 一.基础HTTPURL请求方式 我们先来看一个最简单的例子,通过get方法请求拿到返回值 1.用get方式请求 URL url = new URL( "http://192.168.31.144:10010/M

C#基于LibUsbDotNet实现USB通信(一)

网上C#USB通信的资料比较少, 基本上都是基于LibUsbDotNet 和 CyUsb, 关于打印机设备的还有一个OPOS. 本篇文章基于LibUsbDotNet. 1. 下载并安装 LibUsbDotNet 安装文件. 2. 运行Filter Wizard, Install a device filter. 安装需要通信的usb设备. 3. 建一个简单的控制台项目,进行测试, 下图为打印需要通信设备的信息. 相关代码: 引用 using LibUsbDotNet; using LibUsbD