基于硬件设备进行虚拟串口间通信

基于硬件设备进行虚拟串口间通信

前言

当我们使用VSPD虚拟串口通信软件完成了程序功能的实现和测试,在有硬件设备支持的条件下我们还需要连接硬件设备再测试软件功能是否正常,本篇就如何基于硬件环境下实现串口间通信展开说明。

首先我们需要准备一些硬件设备:

USB转485/422转换器两个

导线若干

若电脑不存在驱动程序还需要安装与硬件对应的驱动程序,这里我使用的转换器包装中厂家带有光盘,里有适用于各个操作系统的驱动程序。因此若需要安装驱动程序还需要

USB便携刻录光驱一个

当然,大家也可以去网上搜索其驱动程序选择下载。

安装驱动程序

当我们把转化器插到电脑主机时,在设备管理器中若出现以下的反馈信息则表示我们在使用串口硬件设备进行串口间通信之前还应先下载好其驱动程序。若是正常显示的硬件设备信息,则可以跳过安装驱动程序部分。

这里我以光盘文件为例介绍一下安装驱动的方法,我们需要把光驱连接到主机上,然后打开光盘中的文件如下图所示,打开DVD驱动器可以得到针对于不同操作系统而分类的文件夹。这里我选择Windows操作系统。

打开Windows文件夹后,选择exe文件直接点击安装即可。

驱动程序安装完成后,再在设备管理器查看硬件设备状态,如下图所示识别出COM3、COM4此时就是识别成功了,图中COM6、COM7是使用VSPD创建的虚拟串口,使用起来特别方便。感兴趣可以去查阅我的另一篇文章——基于VSPD进行虚拟串口间通信。

串口间接线规则

  • 设备识别成功后,相较于虚拟创建的串口间通信,我们还需要在两个串口间进行正确接线连接。在USB转485/422转换器DB9接口前端连接的接线端子上可以看出五路分别是T/R+、T/R-、RXD+、RXD-、GND。
  • RXD:数据输入引脚,数据接受;
  • TXD:数据发送引脚,数据发送

对于RS-232、485、422等不同的串口通信规则,接线方式是不同的,其具体差异我们后面在展开谈论,这里我们以四线全双工通信(RS-422)为例,串口的发送端应该和对向串口的接收端接线,GND不接,接线逻辑如下所示

检测通信质量

接线完成以后,先不要着急用自己写的软件去调试功能,先定位硬件搭建的通信环境是否正常,我们需要将问题排查清楚后在进行调试这是一个很重要的顺序,如下图,笔者接好线并检查后使用串口助手发现串口间怎么也通信不上。遇见问题不要慌,我们先定位问题,现在无非就是哪个串口的收发可能有问题。

我们将刚才的接线断开,在各自的串口上将发送端与接收端相连(T/R+连接RXD+、T/R-连接RXD-),检查串口自身的发送接收是否正常,这样我们发现COM4的收发功能是正常的,COM3却接收不到发送的数据,因此确定了COM3的硬件设备存在硬件问题,需要更换一个串口。

更换掉有问题的串口设备后,按照以上接线和检查方法,通讯是没有问题的。接下来小伙伴们就可以使用软件进行调试了。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
基于STM32的串口通信课程设计可以通过以下步骤实现: 1. 确定硬件平台:选择STM32F103单片机作为主控芯片,同时选择串口通信模块和LED模块作为外设。 2. 确定通信协议:选择虚拟串口软件实现串口助手与STM32的通信,可以使用常见的串口通信协议如UART、SPI等。 3. 实现LED控制:通过串口助手分别发送'A'、'B'、'C'控制三个LED亮;分别发送'a'、'b'、'c'控制三个LED灭。 4. 实现OLED显示:OLED显示通过串口接收到的字符数据,并且将收到的数据通过串口发送至串口助手端,实现串口双向通信。 5. 实现LoRa数据收发:使用Ra-01SC模组和LLCC68芯片实现LoRa数据的收发。 以下是一个基于STM32的串口通信课程设计的代码示例: ```c #include "stm32f10x.h" #include "stdio.h" void USART1_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; 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(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); } void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); } void USART1_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, (uint8_t)ch); } void USART1_SendString(char* str) { while (*str) { USART1_SendChar(*str++); } } char USART1_ReceiveChar(void) { while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); return (char)USART_ReceiveData(USART1); } int main(void) { char ch; USART1_Init(); LED_Init(); while (1) { ch = USART1_ReceiveChar(); switch (ch) { case 'A': GPIO_SetBits(GPIOC, GPIO_Pin_13); break; case 'B': GPIO_ResetBits(GPIOC, GPIO_Pin_13); break; case 'C': USART1_SendString("Hello World!\r\n"); break; default: break; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天还没学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值