在我们的项目需求中,有两个串口应用需求,一个是与炭氢传感器的通讯,另一个是与显示屏的通讯。鉴于此,我们需要实验串行通讯。

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应用开发之三:串行通讯实验的更多相关文章

  1. 串行通讯之Qt

    目录 第1章 Qt 串行通讯    1 1.1 配置.pro文件    1 1.2 查询串口信息    1 1.3 配置.打开串口    3 1.4 setRequestToSend在Windows上 ...

  2. 【Arduino】使用C#实现Arduino与电脑进行串行通讯

    在给Arduino编程的时候,因为没有调试工具,经常要通过使用串口通讯的方式调用Serial.print和Serial.println输出Arduino运行过程中的相关信息,然后在电脑上用Arduin ...

  3. 串行通讯之UARTLoopback

    目录 第1章串行通讯之UARTLoopback    2 1 USB转串口    2 2 USB Accessory    2 3 连入手机    3 4 代码改进    4 5 打开串口    4 ...

  4. 串行通讯之.NET SerialPort

    第1章串行通讯之.NET SerialPort    2 1 枚举串口    2 2 打开/关闭串口    2 3 写数据    3 3.1 写二进制数据    3 3.2 写文本数据    4 4 ...

  5. COM口,串行通讯端口,RS-232接口 基础知识

    COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连 ...

  6. 基于51的串行通讯原理及协议详解(uart)

    串行与并行通讯方式并行:控制简单,传输速度快.线多,长距离成本较高且同时接受困难.串行:将数据字节分成一位一位的行驶在一条传输线上进行传输.如图:   同步与异步串行通讯方式同步串行通讯方式:同步通讯 ...

  7. STM32学习笔记——SPI串行通讯(向原子哥学习)

    一.SPI  简介 SPI是 Serial Peripheral interface 的缩写,就是串行外围设备接口.SPI 接口主要应用在  EEPROM, FLASH,实时时钟,AD 转换器,还有数 ...

  8. 【DSP开发】串行 RapidIO: 高性能嵌入式互连技术

    串行 RapidIO: 高性能嵌入式互连技术 作者: 德州仪器技术应用工程师 冯华亮/ Brighton Feng/ bf@ti.com 摘要 串行RapidIO针对高性能嵌入式系统芯片间和板间互连而 ...

  9. boost库在工作(40)串行通讯

    现代的计算机技术进步很快,各种的通讯也日新月异,像USB.网络.蓝牙.WIFI等通讯技术飞速地出现,改变了整个计算机的通讯能力,速度已经达到GBit级别.但是有一种最原始的通讯方式,还是保留了30年, ...

随机推荐

  1. 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不通外网 ...

  2. Filter Authentication 登录认证

    [编程式配置]可用webxml配置替换@WebListenerpublic class FilterListenerConfigurator implements ServletContextList ...

  3. 查看 Linux memory 内存占用

    linux 系统内存: 如果系统内存使用过高 就会产生 out of memory exception 现象: 通常 在mongo 默认服务运行资源是不受限制的.也会占用而同一系统运行的其他服务: 当 ...

  4. IIS服务器的安全保护措施

    转载自:https://www.williamlong.info/archives/118.html 部分内容做了修改. 通过标注Web服务器安全级别以及可用性的安全策略,网络管理员将能够从容地在不同 ...

  5. Codeforces Round #516 (Div. 2, by Moscow Team Olympiad)

    题目链接 A. Make a triangle! 题意 让某段最少增加多少使得构成三角形 思路 让较小两段往最长段去凑 代码 #include <bits/stdc++.h> #defin ...

  6. [JSON]初识JSON

    1:什么是json json是,是储存和交换文本信息的语法,类似于xml,但是比xml更小,更快,更易解析.   2:JSON的语法规则 JSON中:数据在key/velue对中,数据由对号分隔,花括 ...

  7. vue 导航栏切换

    <template> <footer class="menu"> <router-link to="/" class=" ...

  8. Fragment处理接口回调,网络请求数据

    03-06 19:57:46.138 8691-8691/com.retech.myapplication E/glz: onAttach03-06 19:57:46.138 8691-8691/co ...

  9. npm 常用命令详解(转载)

    学习gulp的使用时,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块的朋友不可错过这 ...

  10. 小玩意--自定义log记录

    之前在帮TCL运维项目时,因某些原因,决定单就经销商相关业务中摒弃经典的log4j日志,改为每日自定义生成并写入相关日志,我遂写了一个util,代码如下:p.s.实现的思路很简单,仅为每次需要记录时, ...