STM32L476应用开发之三:串行通讯实验
在我们的项目需求中,有两个串口应用需求,一个是与炭氢传感器的通讯,另一个是与显示屏的通讯。鉴于此,我们需要实验串行通讯。
1、硬件设计
串行通讯一个采用RS232接口,另一个直接采用TTL方式。我们在STM32L476RG开发板中,发现USART1和USART3的输入输出端口已经引出来,所以我们使用这两个串口。
USART1_TX PA9 CN5-1
USART1_RX PA10 CN9-3
USART3_TX PC4 CN10-34
USART3_RX PC5 CN10-6
如下图红色方框中所示:
对于RS232接口我们采用了周立功RSM232模块来做实验,其推荐的连接方式如下图:
在实验过程中我们不需要这些保护措施,根据以上的分析我们可以对串口通讯做如下设计。RS232接口原理图如下:
对于单总线TTL通讯,我们采用如下原理图来实现:
2、软件设计
完成硬件连接后我们可以开始软件开发了,首先我们在STM32CubeMX中对硬件部分进行配置。其中USART1和USART3的配置如下图所示:
而后对串口部分做参数配置,波特率等按要求配置好,很简单在此不多说了。接下来编写测试代码。
static void Test_UART_Configuration(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = ;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
定义一个简单的类Modbus通讯协议,采用中断方式来实现数据接收。中断处理函数如下:
void USART1_ReceiveDataHandle(void)
{
if(ozonatorRxLength>=RETURNING_DATA_LENGTH)
{
ozonatorRxLength=;
}
/*接收寄存器为空,等待字节被对应的串口完全接收*/
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)
{
uint8_t rData;
/*获取接收到的字节*/
HAL_UART_Receive(&huart1,&rData,,);
TestRxBuffer[ozonatorRxLength++] = rData;
}
}
对接收到的信息进行解析,并根据请求命令完成放回信息的编码并回传。
/*解析接收到的信息,并返回合成的回复信息和信息的字节长度,通过回调函数*/
uint16_t ParsingMasterAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes,uint16_t rxLength)
{
uint16_t respondLength=;
/*判断是否是本站,如不是不处理*/
uint8_t slaveAddress=*receivedMessage;
if(slaveAddress!=StationAddress)
{
return ;
} /*判断功能码是否有误*/
FunctionCode fc=(FunctionCode)(*(receivedMessage+));
if(CheckFunctionCode(fc)!=MB_OK)
{
return ;
} /*信息校验,如不正确则为错误信息不用处理*/
uint16_t dataLength=;
if((fc==WriteMultipleCoil)||(fc==WriteMultipleRegister))
{
dataLength=(uint16_t)(*(receivedMessage+))+;
if(rxLength<dataLength)//尚未接收完整
{
return ;
}
} bool chechMessageNoError=CheckRTUMessageIntegrity(receivedMessage,dataLength);
if(!chechMessageNoError)
{
return ;
} uint16_t startAddress=(uint16_t)(*(receivedMessage+));
startAddress=(startAddress<<)+(uint16_t)(*(receivedMessage+));
uint16_t quantity=(uint16_t)(*(receivedMessage+));
quantity=(quantity<<)+(uint16_t)(*(receivedMessage+));
uint8_t index=(fc>0x08)?(fc-0x09):(fc-0x01); respondLength=HandleMasterCommand[index](startAddress,quantity,receivedMessage,respondBytes); return respondLength;
}
3、测试结果
通过USB转RS232接口的模块接入电脑通过AccessPort和串口出手来对通讯进行测试。下图是在AccessPort中监控到的数据收发状态:
下图是在串口助手中发送命令及接收反馈的截图:
串口通讯方式测试完成,完全能符合我们的要求。
STM32L476应用开发之三:串行通讯实验的更多相关文章
- 串行通讯之Qt
目录 第1章 Qt 串行通讯 1 1.1 配置.pro文件 1 1.2 查询串口信息 1 1.3 配置.打开串口 3 1.4 setRequestToSend在Windows上 ...
- 【Arduino】使用C#实现Arduino与电脑进行串行通讯
在给Arduino编程的时候,因为没有调试工具,经常要通过使用串口通讯的方式调用Serial.print和Serial.println输出Arduino运行过程中的相关信息,然后在电脑上用Arduin ...
- 串行通讯之UARTLoopback
目录 第1章串行通讯之UARTLoopback 2 1 USB转串口 2 2 USB Accessory 2 3 连入手机 3 4 代码改进 4 5 打开串口 4 ...
- 串行通讯之.NET SerialPort
第1章串行通讯之.NET SerialPort 2 1 枚举串口 2 2 打开/关闭串口 2 3 写数据 3 3.1 写二进制数据 3 3.2 写文本数据 4 4 ...
- COM口,串行通讯端口,RS-232接口 基础知识
COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连 ...
- 基于51的串行通讯原理及协议详解(uart)
串行与并行通讯方式并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难.串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图: 同步与异步串行通讯方式同步串行通讯方式:同步通讯 ...
- STM32学习笔记——SPI串行通讯(向原子哥学习)
一.SPI 简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在 EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...
- 【DSP开发】串行 RapidIO: 高性能嵌入式互连技术
串行 RapidIO: 高性能嵌入式互连技术 作者: 德州仪器技术应用工程师 冯华亮/ Brighton Feng/ bf@ti.com 摘要 串行RapidIO针对高性能嵌入式系统芯片间和板间互连而 ...
- boost库在工作(40)串行通讯
现代的计算机技术进步很快,各种的通讯也日新月异,像USB.网络.蓝牙.WIFI等通讯技术飞速地出现,改变了整个计算机的通讯能力,速度已经达到GBit级别.但是有一种最原始的通讯方式,还是保留了30年, ...
随机推荐
- From 192.168.25.133 icmp_seq=238 Destination Host Unreachable 虚拟机ping主机不通
From 192.168.25.133 icmp_seq=238 Destination Host Unreachable 虚拟机ping主机不通,但是主机可以ping通虚拟机,虚拟机ping不通外网 ...
- Filter Authentication 登录认证
[编程式配置]可用webxml配置替换@WebListenerpublic class FilterListenerConfigurator implements ServletContextList ...
- 查看 Linux memory 内存占用
linux 系统内存: 如果系统内存使用过高 就会产生 out of memory exception 现象: 通常 在mongo 默认服务运行资源是不受限制的.也会占用而同一系统运行的其他服务: 当 ...
- IIS服务器的安全保护措施
转载自:https://www.williamlong.info/archives/118.html 部分内容做了修改. 通过标注Web服务器安全级别以及可用性的安全策略,网络管理员将能够从容地在不同 ...
- Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)
题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...
- [JSON]初识JSON
1:什么是json json是,是储存和交换文本信息的语法,类似于xml,但是比xml更小,更快,更易解析. 2:JSON的语法规则 JSON中:数据在key/velue对中,数据由对号分隔,花括 ...
- vue 导航栏切换
<template> <footer class="menu"> <router-link to="/" class=" ...
- Fragment处理接口回调,网络请求数据
03-06 19:57:46.138 8691-8691/com.retech.myapplication E/glz: onAttach03-06 19:57:46.138 8691-8691/co ...
- npm 常用命令详解(转载)
学习gulp的使用时,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块的朋友不可错过这 ...
- 小玩意--自定义log记录
之前在帮TCL运维项目时,因某些原因,决定单就经销商相关业务中摒弃经典的log4j日志,改为每日自定义生成并写入相关日志,我遂写了一个util,代码如下:p.s.实现的思路很简单,仅为每次需要记录时, ...