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

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. 使用PHP+MySql操作——实现微信投票功能

    1. 投票主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  2. oracle 窗口函数over

    select *,sum(字段) over()from table :--相加所有行这个字段的和 select max(字段1),over(partition by  字段2,字段3) from ta ...

  3. IHTMLDocument2类的使用

    class Program    {        static void Main(string[] args)        {            SHDocVw.ShellWindows s ...

  4. Docker 查看容器 IP 地址

    查看Docker的底层信息. docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 docker inspect NAMES # 查看容器所有状态信息: ...

  5. rem和em学习笔记及CSS预处理(未完待续)

    以下为读http://www.w3cplus.com/css/when-to-use-em-vs-rem.html的感悟,收获满满! 1.当元素A的字体单位是n rem时,它将根据根元素(html)的 ...

  6. Java中常见的锁分类以及对应特点

    对于 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性.锁的设计.锁的状态等进行归纳整理的,所以常见的分类如下: 公平锁和非公平锁:公平锁是多线程按照锁申请的顺序获取锁,非公平 ...

  7. 5.21http网页基础

    1,HTML的由来: web网页开发的标准,由w3c万维网联盟组织制定的.是制作网页的规范标准,分为结构标准.表现标准.行为标准.结构:html.表现:css.行为:Javascript. 2,htm ...

  8. vue学习之template标签

    HTML5提供的新标签,具有以下特性: 1.该元素天生display:none,同时模板元素内部内容也是隐藏的 2.位置任意,可以在<head>中,也可以在<body>或者&l ...

  9. invalidate和requestLayout

    Invalidate:To farce a view to draw,call invalidate().——摘自View类源码从上面这句话看出,invalidate方法会执行draw过程,重绘Vie ...

  10. SQLServer常用分页方式

    mysql的分页是基于limit关键字,oracle的分页是基于rownum行号,SQLserver的分页在下面进行研究,是基于SQLServer2012进行的测试. 0.原来的SQL的所有数据 下面 ...