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

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的配置如下图所示:

而后对串口部分做参数配置,波特率等按要求配置好,很简单在此不多说了。接下来编写测试代码。

  1. static void Test_UART_Configuration(void)
  2. {
  3. huart1.Instance = USART1;
  4. huart1.Init.BaudRate = ;
  5. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  6. huart1.Init.StopBits = UART_STOPBITS_1;
  7. huart1.Init.Parity = UART_PARITY_NONE;
  8. huart1.Init.Mode = UART_MODE_TX_RX;
  9. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  10. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  11.  
  12. if (HAL_UART_Init(&huart1) != HAL_OK)
  13. {
  14. Error_Handler();
  15. }

定义一个简单的类Modbus通讯协议,采用中断方式来实现数据接收。中断处理函数如下:

  1. void USART1_ReceiveDataHandle(void)
  2. {
  3. if(ozonatorRxLength>=RETURNING_DATA_LENGTH)
  4. {
  5. ozonatorRxLength=;
  6. }
  7. /*接收寄存器为空,等待字节被对应的串口完全接收*/
  8. if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!=RESET)
  9. {
  10. uint8_t rData;
  11. /*获取接收到的字节*/
  12. HAL_UART_Receive(&huart1,&rData,,);
  13. TestRxBuffer[ozonatorRxLength++] = rData;
  14. }
  15. }

对接收到的信息进行解析,并根据请求命令完成放回信息的编码并回传。

  1. /*解析接收到的信息,并返回合成的回复信息和信息的字节长度,通过回调函数*/
  2. uint16_t ParsingMasterAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes,uint16_t rxLength)
  3. {
  4. uint16_t respondLength=;
  5. /*判断是否是本站,如不是不处理*/
  6. uint8_t slaveAddress=*receivedMessage;
  7. if(slaveAddress!=StationAddress)
  8. {
  9. return ;
  10. }
  11.  
  12. /*判断功能码是否有误*/
  13. FunctionCode fc=(FunctionCode)(*(receivedMessage+));
  14. if(CheckFunctionCode(fc)!=MB_OK)
  15. {
  16. return ;
  17. }
  18.  
  19. /*信息校验,如不正确则为错误信息不用处理*/
  20. uint16_t dataLength=;
  21. if((fc==WriteMultipleCoil)||(fc==WriteMultipleRegister))
  22. {
  23. dataLength=(uint16_t)(*(receivedMessage+))+;
  24. if(rxLength<dataLength)//尚未接收完整
  25. {
  26. return ;
  27. }
  28. }
  29.  
  30. bool chechMessageNoError=CheckRTUMessageIntegrity(receivedMessage,dataLength);
  31. if(!chechMessageNoError)
  32. {
  33. return ;
  34. }
  35.  
  36. uint16_t startAddress=(uint16_t)(*(receivedMessage+));
  37. startAddress=(startAddress<<)+(uint16_t)(*(receivedMessage+));
  38. uint16_t quantity=(uint16_t)(*(receivedMessage+));
  39. quantity=(quantity<<)+(uint16_t)(*(receivedMessage+));
  40. uint8_t index=(fc>0x08)?(fc-0x09):(fc-0x01);
  41.  
  42. respondLength=HandleMasterCommand[index](startAddress,quantity,receivedMessage,respondBytes);
  43.  
  44. return respondLength;
  45. }

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. Spring Boot 起步

    ……………………………………………………………………………………………………………… [应用配置]application.yml [port][context-path][datasource][jp ...

  2. Mysql 的远程设置 和链接方式

    Mysql 设置远程链接: > grant all privileges on *.* to 用户@localhost identified by '密码'; > flush privil ...

  3. 迅为-IMX6UL开发板丨双网口丨双CAN总线丨4路USB HOST丨2路串口、6路插座引出,共8路串口丨1路RGB信号丨2路LVDS信号

    迅为iMX6UL开发板多路串口开发平台迅为i.MX 6UL开发板基于ARM Cortex-A7内核,主频高达528 MHz,内存:512MDDR3存储:8G EMMC,支持2路CAN,2路百兆以太网, ...

  4. kettle mysql 乱码

    在数据库连接上添加字符集编码参数characterEncoding, 指定UTF8或GBK

  5. vue-axios

    vue axios全攻略   不再继续维护vue-resource,并推荐大家使用 axios 开始,axios 被越来越多的人所了解.本来想在网上找找详细攻略,突然发现,axios 的官方文档本身就 ...

  6. 特性Attribute

    1.简介 特性(attribute)是被指定给某一声明的一则附加的声明性信息. 在C#中,有一个小的预定义特性集合.在学习如何建立我们自己的定制特性(custom attributes)之前,我们先来 ...

  7. DIY一些基于netty的开源框架

    几款基于netty的开源框架,有益于对netty的理解和学习! 基于netty的http server框架 https://github.com/TogetherOS/cicada 基于netty的即 ...

  8. Maven 传递依赖冲突解决(了解)

    1 传递依赖冲突解决(了解) 传递依赖:A(项目)依赖B,B依赖C(1.1版本),B是A的直接依赖,C就是A的传递依赖 导入依赖D,D依赖C(1.2版本) 1.1 Maven自己调解原则 1.1.1  ...

  9. 不使用setCustomView,设置ActionBar标题居中

    仅供参考,有太多自定义标题栏需求时,还是建议使用setCustomView https://blog.csdn.net/chiceT/article/details/50455358

  10. 迅为-i.MX6Q核心板_四核工业级

    飞思卡尔Freescale Cortex A9 四核处理器处理器:CPU Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 核心板工艺:十层设计,沉金工艺基本参数:内存 ...